reset composer
This commit is contained in:
parent
43692c7bca
commit
fe8a4dc61c
82
.env
Normal file
82
.env
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Example Environment Configuration file
|
||||||
|
#
|
||||||
|
# This file can be used as a starting point for your own
|
||||||
|
# custom .env files, and contains most of the possible settings
|
||||||
|
# available in a default install.
|
||||||
|
#
|
||||||
|
# By default, all of the settings are commented out. If you want
|
||||||
|
# to override the setting, you must un-comment it by removing the '#'
|
||||||
|
# at the beginning of the line.
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# ENVIRONMENT
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
#CI_ENVIRONMENT = production
|
||||||
|
CI_ENVIRONMENT = development
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# APP
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# app.baseURL = ''
|
||||||
|
app.baseURL = 'http://rest.local/'
|
||||||
|
#app.baseURL = 'http://pbmc-dev.services-summit.my.id/'
|
||||||
|
# If you have trouble with `.`, you could also use `_`.
|
||||||
|
# app_baseURL = ''
|
||||||
|
# app.forceGlobalSecureRequests = false
|
||||||
|
# app.CSPEnabled = false
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# DATABASE
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# database.default.hostname = localhost
|
||||||
|
# database.default.database = ci4
|
||||||
|
# database.default.username = root
|
||||||
|
# database.default.password = root
|
||||||
|
# database.default.DBDriver = MySQLi
|
||||||
|
# database.default.DBPrefix =
|
||||||
|
# database.default.port = 3306
|
||||||
|
|
||||||
|
# If you use MySQLi as tests, first update the values of Config\Database::$tests.
|
||||||
|
# database.tests.hostname = localhost
|
||||||
|
# database.tests.database = ci4_test
|
||||||
|
# database.tests.username = root
|
||||||
|
# database.tests.password = root
|
||||||
|
# database.tests.DBDriver = MySQLi
|
||||||
|
# database.tests.DBPrefix =
|
||||||
|
# database.tests.charset = utf8mb4
|
||||||
|
# database.tests.DBCollat = utf8mb4_general_ci
|
||||||
|
# database.tests.port = 3306
|
||||||
|
|
||||||
|
database.default.hostname = localhost
|
||||||
|
database.default.database = PADMA
|
||||||
|
database.default.username = sa
|
||||||
|
database.default.password = SQLadmin2024
|
||||||
|
database.default.DBDriver = SQLSRV
|
||||||
|
database.default.encrypt = false
|
||||||
|
#database.default.DBPrefix =
|
||||||
|
database.default.pconnect = false
|
||||||
|
database.default.port = 1433
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# ENCRYPTION
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# encryption.key =
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# SESSION
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# session.driver = 'CodeIgniter\Session\Handlers\FileHandler'
|
||||||
|
# session.savePath = null
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# LOGGER
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# logger.threshold = 4
|
||||||
133
.gitignore
vendored
133
.gitignore
vendored
@ -1,7 +1,126 @@
|
|||||||
/*
|
#-------------------------
|
||||||
!app/
|
# Operating Specific Junk Files
|
||||||
!public/
|
#-------------------------
|
||||||
!cretab.sql
|
|
||||||
!.gitignore
|
# OS X
|
||||||
!docs/
|
.DS_Store
|
||||||
!env
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# OS X Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
*~
|
||||||
|
|
||||||
|
# KDE directory preferences
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Linux trash folder which might appear on any partition or disk
|
||||||
|
.Trash-*
|
||||||
|
|
||||||
|
#-------------------------
|
||||||
|
# Environment Files
|
||||||
|
#-------------------------
|
||||||
|
# These should never be under version control,
|
||||||
|
# as it poses a security risk.
|
||||||
|
#.env
|
||||||
|
.vagrant
|
||||||
|
Vagrantfile
|
||||||
|
|
||||||
|
#-------------------------
|
||||||
|
# Temporary Files
|
||||||
|
#-------------------------
|
||||||
|
writable/cache/*
|
||||||
|
!writable/cache/index.html
|
||||||
|
|
||||||
|
writable/logs/*
|
||||||
|
!writable/logs/index.html
|
||||||
|
|
||||||
|
writable/session/*
|
||||||
|
!writable/session/index.html
|
||||||
|
|
||||||
|
writable/uploads/*
|
||||||
|
!writable/uploads/index.html
|
||||||
|
|
||||||
|
writable/debugbar/*
|
||||||
|
!writable/debugbar/.gitkeep
|
||||||
|
|
||||||
|
php_errors.log
|
||||||
|
|
||||||
|
#-------------------------
|
||||||
|
# User Guide Temp Files
|
||||||
|
#-------------------------
|
||||||
|
user_guide_src/build/*
|
||||||
|
user_guide_src/cilexer/build/*
|
||||||
|
user_guide_src/cilexer/dist/*
|
||||||
|
user_guide_src/cilexer/pycilexer.egg-info/*
|
||||||
|
|
||||||
|
#-------------------------
|
||||||
|
# Test Files
|
||||||
|
#-------------------------
|
||||||
|
tests/coverage*
|
||||||
|
|
||||||
|
# Don't save phpunit under version control.
|
||||||
|
phpunit
|
||||||
|
|
||||||
|
#-------------------------
|
||||||
|
# Composer
|
||||||
|
#-------------------------
|
||||||
|
vendor/
|
||||||
|
|
||||||
|
#-------------------------
|
||||||
|
# IDE / Development Files
|
||||||
|
#-------------------------
|
||||||
|
|
||||||
|
# Modules Testing
|
||||||
|
_modules/*
|
||||||
|
|
||||||
|
# phpenv local config
|
||||||
|
.php-version
|
||||||
|
|
||||||
|
# Jetbrains editors (PHPStorm, etc)
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# NetBeans
|
||||||
|
/nbproject/
|
||||||
|
/build/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/nbactions.xml
|
||||||
|
/nb-configuration.xml
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
# Sublime Text
|
||||||
|
*.tmlanguage.cache
|
||||||
|
*.tmPreferences.cache
|
||||||
|
*.stTheme.cache
|
||||||
|
*.sublime-workspace
|
||||||
|
*.sublime-project
|
||||||
|
.phpintel
|
||||||
|
/api/
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
/results/
|
||||||
|
/phpunit*.xml
|
||||||
|
|||||||
22
LICENSE
Normal file
22
LICENSE
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2019 British Columbia Institute of Technology
|
||||||
|
Copyright (c) 2019-2024 CodeIgniter Foundation
|
||||||
|
|
||||||
|
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.
|
||||||
68
README.md
Normal file
68
README.md
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# CodeIgniter 4 Application Starter
|
||||||
|
|
||||||
|
## What is CodeIgniter?
|
||||||
|
|
||||||
|
CodeIgniter is a PHP full-stack web framework that is light, fast, flexible and secure.
|
||||||
|
More information can be found at the [official site](https://codeigniter.com).
|
||||||
|
|
||||||
|
This repository holds a composer-installable app starter.
|
||||||
|
It has been built from the
|
||||||
|
[development repository](https://github.com/codeigniter4/CodeIgniter4).
|
||||||
|
|
||||||
|
More information about the plans for version 4 can be found in [CodeIgniter 4](https://forum.codeigniter.com/forumdisplay.php?fid=28) on the forums.
|
||||||
|
|
||||||
|
You can read the [user guide](https://codeigniter.com/user_guide/)
|
||||||
|
corresponding to the latest version of the framework.
|
||||||
|
|
||||||
|
## Installation & updates
|
||||||
|
|
||||||
|
`composer create-project codeigniter4/appstarter` then `composer update` whenever
|
||||||
|
there is a new release of the framework.
|
||||||
|
|
||||||
|
When updating, check the release notes to see if there are any changes you might need to apply
|
||||||
|
to your `app` folder. The affected files can be copied or merged from
|
||||||
|
`vendor/codeigniter4/framework/app`.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Copy `env` to `.env` and tailor for your app, specifically the baseURL
|
||||||
|
and any database settings.
|
||||||
|
|
||||||
|
## Important Change with index.php
|
||||||
|
|
||||||
|
`index.php` is no longer in the root of the project! It has been moved inside the *public* folder,
|
||||||
|
for better security and separation of components.
|
||||||
|
|
||||||
|
This means that you should configure your web server to "point" to your project's *public* folder, and
|
||||||
|
not to the project root. A better practice would be to configure a virtual host to point there. A poor practice would be to point your web server to the project root and expect to enter *public/...*, as the rest of your logic and the
|
||||||
|
framework are exposed.
|
||||||
|
|
||||||
|
**Please** read the user guide for a better explanation of how CI4 works!
|
||||||
|
|
||||||
|
## Repository Management
|
||||||
|
|
||||||
|
We use GitHub issues, in our main repository, to track **BUGS** and to track approved **DEVELOPMENT** work packages.
|
||||||
|
We use our [forum](http://forum.codeigniter.com) to provide SUPPORT and to discuss
|
||||||
|
FEATURE REQUESTS.
|
||||||
|
|
||||||
|
This repository is a "distribution" one, built by our release preparation script.
|
||||||
|
Problems with it can be raised on our forum, or as issues in the main repository.
|
||||||
|
|
||||||
|
## Server Requirements
|
||||||
|
|
||||||
|
PHP version 8.1 or higher is required, with the following extensions installed:
|
||||||
|
|
||||||
|
- [intl](http://php.net/manual/en/intl.requirements.php)
|
||||||
|
- [mbstring](http://php.net/manual/en/mbstring.installation.php)
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> - The end of life date for PHP 7.4 was November 28, 2022.
|
||||||
|
> - The end of life date for PHP 8.0 was November 26, 2023.
|
||||||
|
> - If you are still using PHP 7.4 or 8.0, you should upgrade immediately.
|
||||||
|
> - The end of life date for PHP 8.1 will be December 31, 2025.
|
||||||
|
|
||||||
|
Additionally, make sure that the following extensions are enabled in your PHP:
|
||||||
|
|
||||||
|
- json (enabled by default - don't turn it off)
|
||||||
|
- [mysqlnd](http://php.net/manual/en/mysqlnd.install.php) if you plan to use MySQL
|
||||||
|
- [libcurl](http://php.net/manual/en/curl.requirements.php) if you plan to use the HTTP\CURLRequest library
|
||||||
125
builds
Normal file
125
builds
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
define('LATEST_RELEASE', '^4.0');
|
||||||
|
define('GITHUB_URL', 'https://github.com/codeigniter4/codeigniter4');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Stability Toggle
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Use this script to toggle the CodeIgniter dependency between the
|
||||||
|
* latest stable release and the most recent development update.
|
||||||
|
*
|
||||||
|
* Usage: php builds [release|development]
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Determine the requested stability
|
||||||
|
if (empty($argv[1]) || ! in_array($argv[1], ['release', 'development'], true)) {
|
||||||
|
echo 'Usage: php builds [release|development]' . PHP_EOL;
|
||||||
|
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dev = $argv[1] === 'development';
|
||||||
|
|
||||||
|
$modified = [];
|
||||||
|
|
||||||
|
// Locate each file and update it for the requested stability
|
||||||
|
|
||||||
|
$file = __DIR__ . DIRECTORY_SEPARATOR . 'composer.json';
|
||||||
|
|
||||||
|
if (is_file($file)) {
|
||||||
|
$contents = file_get_contents($file);
|
||||||
|
|
||||||
|
if ((string) $contents !== '') {
|
||||||
|
$array = json_decode($contents, true);
|
||||||
|
|
||||||
|
if (is_array($array)) {
|
||||||
|
if ($dev) {
|
||||||
|
$array['minimum-stability'] = 'dev';
|
||||||
|
$array['prefer-stable'] = true;
|
||||||
|
$array['repositories'] ??= [];
|
||||||
|
|
||||||
|
$found = false;
|
||||||
|
|
||||||
|
foreach ($array['repositories'] as $repository) {
|
||||||
|
if ($repository['url'] === GITHUB_URL) {
|
||||||
|
$found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $found) {
|
||||||
|
$array['repositories'][] = [
|
||||||
|
'type' => 'vcs',
|
||||||
|
'url' => GITHUB_URL,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$array['require']['codeigniter4/codeigniter4'] = 'dev-develop';
|
||||||
|
unset($array['require']['codeigniter4/framework']);
|
||||||
|
} else {
|
||||||
|
unset($array['minimum-stability']);
|
||||||
|
|
||||||
|
if (isset($array['repositories'])) {
|
||||||
|
foreach ($array['repositories'] as $i => $repository) {
|
||||||
|
if ($repository['url'] === GITHUB_URL) {
|
||||||
|
unset($array['repositories'][$i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($array['repositories'])) {
|
||||||
|
unset($array['repositories']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$array['require']['codeigniter4/framework'] = LATEST_RELEASE;
|
||||||
|
unset($array['require']['codeigniter4/codeigniter4']);
|
||||||
|
}
|
||||||
|
|
||||||
|
file_put_contents($file, json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL);
|
||||||
|
|
||||||
|
$modified[] = $file;
|
||||||
|
} else {
|
||||||
|
echo 'Warning: Unable to decode composer.json! Skipping...' . PHP_EOL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo 'Warning: Unable to read composer.json! Skipping...' . PHP_EOL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$files = [
|
||||||
|
__DIR__ . DIRECTORY_SEPARATOR . 'app/Config/Paths.php',
|
||||||
|
__DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml.dist',
|
||||||
|
__DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($files as $file) {
|
||||||
|
if (is_file($file)) {
|
||||||
|
$contents = file_get_contents($file);
|
||||||
|
|
||||||
|
if ($dev) {
|
||||||
|
$contents = str_replace('vendor/codeigniter4/framework', 'vendor/codeigniter4/codeigniter4', $contents);
|
||||||
|
} else {
|
||||||
|
$contents = str_replace('vendor/codeigniter4/codeigniter4', 'vendor/codeigniter4/framework', $contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
file_put_contents($file, $contents);
|
||||||
|
|
||||||
|
$modified[] = $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($modified === []) {
|
||||||
|
echo 'No files modified.' . PHP_EOL;
|
||||||
|
} else {
|
||||||
|
echo 'The following files were modified:' . PHP_EOL;
|
||||||
|
|
||||||
|
foreach ($modified as $file) {
|
||||||
|
echo " * {$file}" . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo 'Run `composer update` to sync changes with your vendor folder.' . PHP_EOL;
|
||||||
|
}
|
||||||
44
composer.json
Normal file
44
composer.json
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "codeigniter4/appstarter",
|
||||||
|
"description": "CodeIgniter4 starter app",
|
||||||
|
"license": "MIT",
|
||||||
|
"type": "project",
|
||||||
|
"homepage": "https://codeigniter.com",
|
||||||
|
"support": {
|
||||||
|
"forum": "https://forum.codeigniter.com/",
|
||||||
|
"source": "https://github.com/codeigniter4/CodeIgniter4",
|
||||||
|
"slack": "https://codeigniterchat.slack.com"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^8.1",
|
||||||
|
"codeigniter4/framework": "^4.0",
|
||||||
|
"michalsn/codeigniter4-uuid": "^1.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"fakerphp/faker": "^1.9",
|
||||||
|
"mikey179/vfsstream": "^1.6",
|
||||||
|
"phpunit/phpunit": "^10.5.16"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\": "app/",
|
||||||
|
"Config\\": "app/Config/"
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"**/Database/Migrations/**"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"Tests\\Support\\": "tests/_support"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"optimize-autoloader": true,
|
||||||
|
"preferred-install": "dist",
|
||||||
|
"sort-packages": true
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "phpunit"
|
||||||
|
}
|
||||||
|
}
|
||||||
2361
composer.lock
generated
Normal file
2361
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
63
phpunit.xml.dist
Normal file
63
phpunit.xml.dist
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
|
||||||
|
bootstrap="vendor/codeigniter4/framework/system/Test/bootstrap.php"
|
||||||
|
backupGlobals="false"
|
||||||
|
beStrictAboutOutputDuringTests="true"
|
||||||
|
colors="true"
|
||||||
|
columns="max"
|
||||||
|
failOnRisky="true"
|
||||||
|
failOnWarning="true"
|
||||||
|
cacheDirectory="build/.phpunit.cache">
|
||||||
|
<coverage
|
||||||
|
includeUncoveredFiles="true"
|
||||||
|
pathCoverage="false"
|
||||||
|
ignoreDeprecatedCodeUnits="true"
|
||||||
|
disableCodeCoverageIgnore="true">
|
||||||
|
<report>
|
||||||
|
<clover outputFile="build/logs/clover.xml"/>
|
||||||
|
<html outputDirectory="build/logs/html"/>
|
||||||
|
<php outputFile="build/logs/coverage.serialized"/>
|
||||||
|
<text outputFile="php://stdout" showUncoveredFiles="false"/>
|
||||||
|
</report>
|
||||||
|
</coverage>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="App">
|
||||||
|
<directory>./tests</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
<logging>
|
||||||
|
<testdoxHtml outputFile="build/logs/testdox.html"/>
|
||||||
|
<testdoxText outputFile="build/logs/testdox.txt"/>
|
||||||
|
<junit outputFile="build/logs/logfile.xml"/>
|
||||||
|
</logging>
|
||||||
|
<source>
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">./app</directory>
|
||||||
|
</include>
|
||||||
|
<exclude>
|
||||||
|
<directory suffix=".php">./app/Views</directory>
|
||||||
|
<file>./app/Config/Routes.php</file>
|
||||||
|
</exclude>
|
||||||
|
</source>
|
||||||
|
<php>
|
||||||
|
<server name="app.baseURL" value="http://example.com/"/>
|
||||||
|
<server name="CODEIGNITER_SCREAM_DEPRECATIONS" value="0"/>
|
||||||
|
<!-- Directory containing phpunit.xml -->
|
||||||
|
<const name="HOMEPATH" value="./"/>
|
||||||
|
<!-- Directory containing the Paths config file -->
|
||||||
|
<const name="CONFIGPATH" value="./app/Config/"/>
|
||||||
|
<!-- Directory containing the front controller (index.php) -->
|
||||||
|
<const name="PUBLICPATH" value="./public/"/>
|
||||||
|
<!-- Database configuration -->
|
||||||
|
<!-- Uncomment to provide your own database for testing
|
||||||
|
<env name="database.tests.hostname" value="localhost"/>
|
||||||
|
<env name="database.tests.database" value="tests"/>
|
||||||
|
<env name="database.tests.username" value="tests_user"/>
|
||||||
|
<env name="database.tests.password" value=""/>
|
||||||
|
<env name="database.tests.DBDriver" value="MySQLi"/>
|
||||||
|
<env name="database.tests.DBPrefix" value="tests_"/>
|
||||||
|
-->
|
||||||
|
</php>
|
||||||
|
</phpunit>
|
||||||
106
preload.php
Normal file
106
preload.php
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file is part of CodeIgniter 4 framework.
|
||||||
|
*
|
||||||
|
* (c) CodeIgniter Foundation <admin@codeigniter.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* Sample file for Preloading
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* See https://www.php.net/manual/en/opcache.preloading.php
|
||||||
|
*
|
||||||
|
* How to Use:
|
||||||
|
* 0. Copy this file to your project root folder.
|
||||||
|
* 1. Set the $paths property of the preload class below.
|
||||||
|
* 2. Set opcache.preload in php.ini.
|
||||||
|
* php.ini:
|
||||||
|
* opcache.preload=/path/to/preload.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Load the paths config file
|
||||||
|
require __DIR__ . '/app/Config/Paths.php';
|
||||||
|
|
||||||
|
// Path to the front controller
|
||||||
|
define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR);
|
||||||
|
|
||||||
|
class preload
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array Paths to preload.
|
||||||
|
*/
|
||||||
|
private array $paths = [
|
||||||
|
[
|
||||||
|
'include' => __DIR__ . '/vendor/codeigniter4/framework/system', // Change this path if using manual installation
|
||||||
|
'exclude' => [
|
||||||
|
// Not needed if you don't use them.
|
||||||
|
'/system/Database/OCI8/',
|
||||||
|
'/system/Database/Postgre/',
|
||||||
|
'/system/Database/SQLite3/',
|
||||||
|
'/system/Database/SQLSRV/',
|
||||||
|
// Not needed for web apps.
|
||||||
|
'/system/Database/Seeder.php',
|
||||||
|
'/system/Test/',
|
||||||
|
'/system/CLI/',
|
||||||
|
'/system/Commands/',
|
||||||
|
'/system/Publisher/',
|
||||||
|
'/system/ComposerScripts.php',
|
||||||
|
// Not Class/Function files.
|
||||||
|
'/system/Config/Routes.php',
|
||||||
|
'/system/Language/',
|
||||||
|
'/system/bootstrap.php',
|
||||||
|
'/system/rewrite.php',
|
||||||
|
'/Views/',
|
||||||
|
// Errors occur.
|
||||||
|
'/system/ThirdParty/',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->loadAutoloader();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function loadAutoloader(): void
|
||||||
|
{
|
||||||
|
$paths = new Config\Paths();
|
||||||
|
require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'Boot.php';
|
||||||
|
|
||||||
|
CodeIgniter\Boot::preload($paths);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load PHP files.
|
||||||
|
*/
|
||||||
|
public function load(): void
|
||||||
|
{
|
||||||
|
foreach ($this->paths as $path) {
|
||||||
|
$directory = new RecursiveDirectoryIterator($path['include']);
|
||||||
|
$fullTree = new RecursiveIteratorIterator($directory);
|
||||||
|
$phpFiles = new RegexIterator(
|
||||||
|
$fullTree,
|
||||||
|
'/.+((?<!Test)+\.php$)/i',
|
||||||
|
RecursiveRegexIterator::GET_MATCH
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($phpFiles as $key => $file) {
|
||||||
|
foreach ($path['exclude'] as $exclude) {
|
||||||
|
if (str_contains($file[0], $exclude)) {
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once $file[0];
|
||||||
|
echo 'Loaded: ' . $file[0] . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(new preload())->load();
|
||||||
84
spark
Normal file
84
spark
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file is part of CodeIgniter 4 framework.
|
||||||
|
*
|
||||||
|
* (c) CodeIgniter Foundation <admin@codeigniter.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* CODEIGNITER COMMAND-LINE TOOLS
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* The main entry point into the CLI system and allows you to run
|
||||||
|
* commands and perform maintenance on your application.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* CHECK SERVER API
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Refuse to run when called from php-cgi
|
||||||
|
if (str_starts_with(PHP_SAPI, 'cgi')) {
|
||||||
|
exit("The cli tool is not supported when running php-cgi. It needs php-cli to function!\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* CHECK PHP VERSION
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$minPhpVersion = '8.1'; // If you update this, don't forget to update `public/index.php`.
|
||||||
|
if (version_compare(PHP_VERSION, $minPhpVersion, '<')) {
|
||||||
|
$message = sprintf(
|
||||||
|
'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',
|
||||||
|
$minPhpVersion,
|
||||||
|
PHP_VERSION
|
||||||
|
);
|
||||||
|
|
||||||
|
exit($message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We want errors to be shown when using it from the CLI.
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
ini_set('display_errors', '1');
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* SET THE CURRENT DIRECTORY
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Path to the front controller
|
||||||
|
define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR);
|
||||||
|
|
||||||
|
// Ensure the current directory is pointing to the front controller's directory
|
||||||
|
chdir(FCPATH);
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* BOOTSTRAP THE APPLICATION
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* This process sets up the path constants, loads and registers
|
||||||
|
* our autoloader, along with Composer's, loads our constants
|
||||||
|
* and fires up an environment-specific bootstrapping.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// LOAD OUR PATHS CONFIG FILE
|
||||||
|
// This is the line that might need to be changed, depending on your folder structure.
|
||||||
|
require FCPATH . '../app/Config/Paths.php';
|
||||||
|
// ^^^ Change this line if you move your application folder
|
||||||
|
|
||||||
|
$paths = new Config\Paths();
|
||||||
|
|
||||||
|
// LOAD THE FRAMEWORK BOOTSTRAP FILE
|
||||||
|
require $paths->systemDirectory . '/Boot.php';
|
||||||
|
|
||||||
|
exit(CodeIgniter\Boot::bootSpark($paths));
|
||||||
6
tests/.htaccess
Normal file
6
tests/.htaccess
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<IfModule authz_core_module>
|
||||||
|
Require all denied
|
||||||
|
</IfModule>
|
||||||
|
<IfModule !authz_core_module>
|
||||||
|
Deny from all
|
||||||
|
</IfModule>
|
||||||
118
tests/README.md
Normal file
118
tests/README.md
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
# Running Application Tests
|
||||||
|
|
||||||
|
This is the quick-start to CodeIgniter testing. Its intent is to describe what
|
||||||
|
it takes to set up your application and get it ready to run unit tests.
|
||||||
|
It is not intended to be a full description of the test features that you can
|
||||||
|
use to test your application. Those details can be found in the documentation.
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
* [CodeIgniter 4 User Guide on Testing](https://codeigniter.com/user_guide/testing/index.html)
|
||||||
|
* [PHPUnit docs](https://phpunit.de/documentation.html)
|
||||||
|
* [Any tutorials on Unit testing in CI4?](https://forum.codeigniter.com/showthread.php?tid=81830)
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
It is recommended to use the latest version of PHPUnit. At the time of this
|
||||||
|
writing, we are running version 9.x. Support for this has been built into the
|
||||||
|
**composer.json** file that ships with CodeIgniter and can easily be installed
|
||||||
|
via [Composer](https://getcomposer.org/) if you don't already have it installed globally.
|
||||||
|
|
||||||
|
```console
|
||||||
|
> composer install
|
||||||
|
```
|
||||||
|
|
||||||
|
If running under macOS or Linux, you can create a symbolic link to make running tests a touch nicer.
|
||||||
|
|
||||||
|
```console
|
||||||
|
> ln -s ./vendor/bin/phpunit ./phpunit
|
||||||
|
```
|
||||||
|
|
||||||
|
You also need to install [XDebug](https://xdebug.org/docs/install) in order
|
||||||
|
for code coverage to be calculated successfully. After installing `XDebug`, you must add `xdebug.mode=coverage` in the **php.ini** file to enable code coverage.
|
||||||
|
|
||||||
|
## Setting Up
|
||||||
|
|
||||||
|
A number of the tests use a running database.
|
||||||
|
In order to set up the database edit the details for the `tests` group in
|
||||||
|
**app/Config/Database.php** or **.env**.
|
||||||
|
Make sure that you provide a database engine that is currently running on your machine.
|
||||||
|
More details on a test database setup are in the
|
||||||
|
[Testing Your Database](https://codeigniter.com/user_guide/testing/database.html) section of the documentation.
|
||||||
|
|
||||||
|
## Running the tests
|
||||||
|
|
||||||
|
The entire test suite can be run by simply typing one command-line command from the main directory.
|
||||||
|
|
||||||
|
```console
|
||||||
|
> ./phpunit
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are using Windows, use the following command.
|
||||||
|
|
||||||
|
```console
|
||||||
|
> vendor\bin\phpunit
|
||||||
|
```
|
||||||
|
|
||||||
|
You can limit tests to those within a single test directory by specifying the
|
||||||
|
directory name after phpunit.
|
||||||
|
|
||||||
|
```console
|
||||||
|
> ./phpunit app/Models
|
||||||
|
```
|
||||||
|
|
||||||
|
## Generating Code Coverage
|
||||||
|
|
||||||
|
To generate coverage information, including HTML reports you can view in your browser,
|
||||||
|
you can use the following command:
|
||||||
|
|
||||||
|
```console
|
||||||
|
> ./phpunit --colors --coverage-text=tests/coverage.txt --coverage-html=tests/coverage/ -d memory_limit=1024m
|
||||||
|
```
|
||||||
|
|
||||||
|
This runs all of the tests again collecting information about how many lines,
|
||||||
|
functions, and files are tested. It also reports the percentage of the code that is covered by tests.
|
||||||
|
It is collected in two formats: a simple text file that provides an overview as well
|
||||||
|
as a comprehensive collection of HTML files that show the status of every line of code in the project.
|
||||||
|
|
||||||
|
The text file can be found at **tests/coverage.txt**.
|
||||||
|
The HTML files can be viewed by opening **tests/coverage/index.html** in your favorite browser.
|
||||||
|
|
||||||
|
## PHPUnit XML Configuration
|
||||||
|
|
||||||
|
The repository has a ``phpunit.xml.dist`` file in the project root that's used for
|
||||||
|
PHPUnit configuration. This is used to provide a default configuration if you
|
||||||
|
do not have your own configuration file in the project root.
|
||||||
|
|
||||||
|
The normal practice would be to copy ``phpunit.xml.dist`` to ``phpunit.xml``
|
||||||
|
(which is git ignored), and to tailor it as you see fit.
|
||||||
|
For instance, you might wish to exclude database tests, or automatically generate
|
||||||
|
HTML code coverage reports.
|
||||||
|
|
||||||
|
## Test Cases
|
||||||
|
|
||||||
|
Every test needs a *test case*, or class that your tests extend. CodeIgniter 4
|
||||||
|
provides one class that you may use directly:
|
||||||
|
* `CodeIgniter\Test\CIUnitTestCase`
|
||||||
|
|
||||||
|
Most of the time you will want to write your own test cases that extend `CIUnitTestCase`
|
||||||
|
to hold functions and services common to your test suites.
|
||||||
|
|
||||||
|
## Creating Tests
|
||||||
|
|
||||||
|
All tests go in the **tests/** directory. Each test file is a class that extends a
|
||||||
|
**Test Case** (see above) and contains methods for the individual tests. These method
|
||||||
|
names must start with the word "test" and should have descriptive names for precisely what
|
||||||
|
they are testing:
|
||||||
|
`testUserCanModifyFile()` `testOutputColorMatchesInput()` `testIsLoggedInFailsWithInvalidUser()`
|
||||||
|
|
||||||
|
Writing tests is an art, and there are many resources available to help learn how.
|
||||||
|
Review the links above and always pay attention to your code coverage.
|
||||||
|
|
||||||
|
### Database Tests
|
||||||
|
|
||||||
|
Tests can include migrating, seeding, and testing against a mock or live database.
|
||||||
|
Be sure to modify the test case (or create your own) to point to your seed and migrations
|
||||||
|
and include any additional steps to be run before tests in the `setUp()` method.
|
||||||
|
See [Testing Your Database](https://codeigniter.com/user_guide/testing/database.html)
|
||||||
|
for details.
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Support\Database\Migrations;
|
||||||
|
|
||||||
|
use CodeIgniter\Database\Migration;
|
||||||
|
|
||||||
|
class ExampleMigration extends Migration
|
||||||
|
{
|
||||||
|
protected $DBGroup = 'tests';
|
||||||
|
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
$this->forge->addField('id');
|
||||||
|
$this->forge->addField([
|
||||||
|
'name' => ['type' => 'varchar', 'constraint' => 31],
|
||||||
|
'uid' => ['type' => 'varchar', 'constraint' => 31],
|
||||||
|
'class' => ['type' => 'varchar', 'constraint' => 63],
|
||||||
|
'icon' => ['type' => 'varchar', 'constraint' => 31],
|
||||||
|
'summary' => ['type' => 'varchar', 'constraint' => 255],
|
||||||
|
'created_at' => ['type' => 'datetime', 'null' => true],
|
||||||
|
'updated_at' => ['type' => 'datetime', 'null' => true],
|
||||||
|
'deleted_at' => ['type' => 'datetime', 'null' => true],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->forge->addKey('name');
|
||||||
|
$this->forge->addKey('uid');
|
||||||
|
$this->forge->addKey(['deleted_at', 'id']);
|
||||||
|
$this->forge->addKey('created_at');
|
||||||
|
|
||||||
|
$this->forge->createTable('factories');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
$this->forge->dropTable('factories');
|
||||||
|
}
|
||||||
|
}
|
||||||
41
tests/_support/Database/Seeds/ExampleSeeder.php
Normal file
41
tests/_support/Database/Seeds/ExampleSeeder.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Support\Database\Seeds;
|
||||||
|
|
||||||
|
use CodeIgniter\Database\Seeder;
|
||||||
|
|
||||||
|
class ExampleSeeder extends Seeder
|
||||||
|
{
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
$factories = [
|
||||||
|
[
|
||||||
|
'name' => 'Test Factory',
|
||||||
|
'uid' => 'test001',
|
||||||
|
'class' => 'Factories\Tests\NewFactory',
|
||||||
|
'icon' => 'fas fa-puzzle-piece',
|
||||||
|
'summary' => 'Longer sample text for testing',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Widget Factory',
|
||||||
|
'uid' => 'widget',
|
||||||
|
'class' => 'Factories\Tests\WidgetPlant',
|
||||||
|
'icon' => 'fas fa-puzzle-piece',
|
||||||
|
'summary' => 'Create widgets in your factory',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Evil Factory',
|
||||||
|
'uid' => 'evil-maker',
|
||||||
|
'class' => 'Factories\Evil\MyFactory',
|
||||||
|
'icon' => 'fas fa-book-dead',
|
||||||
|
'summary' => 'Abandon all hope, ye who enter here',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$builder = $this->db->table('factories');
|
||||||
|
|
||||||
|
foreach ($factories as $factory) {
|
||||||
|
$builder->insert($factory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
tests/_support/Libraries/ConfigReader.php
Normal file
17
tests/_support/Libraries/ConfigReader.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Support\Libraries;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ConfigReader
|
||||||
|
*
|
||||||
|
* An extension of BaseConfig that prevents the constructor from
|
||||||
|
* loading external values. Used to read actual local values from
|
||||||
|
* a config file.
|
||||||
|
*/
|
||||||
|
class ConfigReader extends \Config\App
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
24
tests/_support/Models/ExampleModel.php
Normal file
24
tests/_support/Models/ExampleModel.php
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Support\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class ExampleModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'factories';
|
||||||
|
protected $primaryKey = 'id';
|
||||||
|
protected $returnType = 'object';
|
||||||
|
protected $useSoftDeletes = false;
|
||||||
|
protected $allowedFields = [
|
||||||
|
'name',
|
||||||
|
'uid',
|
||||||
|
'class',
|
||||||
|
'icon',
|
||||||
|
'summary',
|
||||||
|
];
|
||||||
|
protected $useTimestamps = true;
|
||||||
|
protected $validationRules = [];
|
||||||
|
protected $validationMessages = [];
|
||||||
|
protected $skipValidation = false;
|
||||||
|
}
|
||||||
46
tests/database/ExampleDatabaseTest.php
Normal file
46
tests/database/ExampleDatabaseTest.php
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use CodeIgniter\Test\CIUnitTestCase;
|
||||||
|
use CodeIgniter\Test\DatabaseTestTrait;
|
||||||
|
use Tests\Support\Database\Seeds\ExampleSeeder;
|
||||||
|
use Tests\Support\Models\ExampleModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class ExampleDatabaseTest extends CIUnitTestCase
|
||||||
|
{
|
||||||
|
use DatabaseTestTrait;
|
||||||
|
|
||||||
|
protected $seed = ExampleSeeder::class;
|
||||||
|
|
||||||
|
public function testModelFindAll(): void
|
||||||
|
{
|
||||||
|
$model = new ExampleModel();
|
||||||
|
|
||||||
|
// Get every row created by ExampleSeeder
|
||||||
|
$objects = $model->findAll();
|
||||||
|
|
||||||
|
// Make sure the count is as expected
|
||||||
|
$this->assertCount(3, $objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSoftDeleteLeavesRow(): void
|
||||||
|
{
|
||||||
|
$model = new ExampleModel();
|
||||||
|
$this->setPrivateProperty($model, 'useSoftDeletes', true);
|
||||||
|
$this->setPrivateProperty($model, 'tempUseSoftDeletes', true);
|
||||||
|
|
||||||
|
/** @var stdClass $object */
|
||||||
|
$object = $model->first();
|
||||||
|
$model->delete($object->id);
|
||||||
|
|
||||||
|
// The model should no longer find it
|
||||||
|
$this->assertNull($model->find($object->id));
|
||||||
|
|
||||||
|
// ... but it should still be in the database
|
||||||
|
$result = $model->builder()->where('id', $object->id)->get()->getResult();
|
||||||
|
|
||||||
|
$this->assertCount(1, $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
tests/index.html
Normal file
11
tests/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
17
tests/session/ExampleSessionTest.php
Normal file
17
tests/session/ExampleSessionTest.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use CodeIgniter\Test\CIUnitTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class ExampleSessionTest extends CIUnitTestCase
|
||||||
|
{
|
||||||
|
public function testSessionSimple(): void
|
||||||
|
{
|
||||||
|
$session = service('session');
|
||||||
|
|
||||||
|
$session->set('logged_in', 123);
|
||||||
|
$this->assertSame(123, $session->get('logged_in'));
|
||||||
|
}
|
||||||
|
}
|
||||||
49
tests/unit/HealthTest.php
Normal file
49
tests/unit/HealthTest.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use CodeIgniter\Test\CIUnitTestCase;
|
||||||
|
use Config\App;
|
||||||
|
use Tests\Support\Libraries\ConfigReader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class HealthTest extends CIUnitTestCase
|
||||||
|
{
|
||||||
|
public function testIsDefinedAppPath(): void
|
||||||
|
{
|
||||||
|
$this->assertTrue(defined('APPPATH'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBaseUrlHasBeenSet(): void
|
||||||
|
{
|
||||||
|
$validation = service('validation');
|
||||||
|
|
||||||
|
$env = false;
|
||||||
|
|
||||||
|
// Check the baseURL in .env
|
||||||
|
if (is_file(HOMEPATH . '.env')) {
|
||||||
|
$env = preg_grep('/^app\.baseURL = ./', file(HOMEPATH . '.env')) !== false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($env) {
|
||||||
|
// BaseURL in .env is a valid URL?
|
||||||
|
// phpunit.xml.dist sets app.baseURL in $_SERVER
|
||||||
|
// So if you set app.baseURL in .env, it takes precedence
|
||||||
|
$config = new App();
|
||||||
|
$this->assertTrue(
|
||||||
|
$validation->check($config->baseURL, 'valid_url'),
|
||||||
|
'baseURL "' . $config->baseURL . '" in .env is not valid URL'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the baseURL in app/Config/App.php
|
||||||
|
// You can't use Config\App, because phpunit.xml.dist sets app.baseURL
|
||||||
|
$reader = new ConfigReader();
|
||||||
|
|
||||||
|
// BaseURL in app/Config/App.php is a valid URL?
|
||||||
|
$this->assertTrue(
|
||||||
|
$validation->check($reader->baseURL, 'valid_url'),
|
||||||
|
'baseURL "' . $reader->baseURL . '" in app/Config/App.php is not valid URL'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
6
writable/.htaccess
Normal file
6
writable/.htaccess
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<IfModule authz_core_module>
|
||||||
|
Require all denied
|
||||||
|
</IfModule>
|
||||||
|
<IfModule !authz_core_module>
|
||||||
|
Deny from all
|
||||||
|
</IfModule>
|
||||||
11
writable/cache/index.html
vendored
Normal file
11
writable/cache/index.html
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
11
writable/index.html
Normal file
11
writable/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
11
writable/logs/index.html
Normal file
11
writable/logs/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
11
writable/session/index.html
Normal file
11
writable/session/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
11
writable/uploads/index.html
Normal file
11
writable/uploads/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user