removed old phpunit

phpunit was only for testing
This commit is contained in:
gtbu 2025-07-31 17:52:51 +02:00
parent 8ec460c113
commit 2b21aaa6f9
38 changed files with 0 additions and 2066 deletions

View file

@ -1,28 +0,0 @@
language: php
jobs:
include:
- php: 5.6
- php: 7.0
- php: 7.1
- php: 7.2
- php: 7.3
- php: 7.4
- php: 7.2
env: gp_data_type=.json
# phpunit 8 will result in an error
# https://www.reddit.com/r/PHPhelp/comments/apipqs/travis_specifying_phpunit_version/
before_script:
- composer init -n
- composer require phpunit/phpunit "<8 >=4"
- composer require symfony/process
- composer require guzzlehttp/guzzle
- composer require phpunit/php-code-coverage "<7" # for phpunit compat
#- phpenv config-add phpunit/phpconfig.ini
script:
- vendor/bin/phpunit
- php phpunit/ServerCombineCoverage.php
- bash <(curl -s https://codecov.io/bash) -s ./x_coverage # Submit coverage report to https://codecov.io

View file

@ -1 +0,0 @@
comment: false

View file

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
processIsolation = "false"
stopOnFailure = "true"
stopOnError = "true"
stopOnIncomplete = "true"
stopOnSkipped = "false"
bootstrap = "phpunit/bootstrap.php"
verbose = "true"
>
<testsuites>
<testsuite name="Tools">
<directory>phpunit/Tool</directory>
<directory>phpunit/Include</directory>
<directory>phpunit/Settings</directory>
</testsuite>
<testsuite name="Installation">
<directory>phpunit/Install</directory>
<directory>phpunit/Admin</directory>
</testsuite>
<testsuite name="Admin">
<directory>phpunit/Admin</directory>
</testsuite>
</testsuites>
<logging>
<log type="testdox-text" target="php://stdout"/>
<log type="coverage-clover" target="x_coverage/unit-tests.clover"/>
</logging>
<filter>
<whitelist>
<directory suffix=".php">./include</directory>
<exclude>
<directory suffix=".php">./include/thirdparty</directory>
</exclude>
</whitelist>
</filter>
</phpunit>

View file

@ -1,57 +0,0 @@
<?php
namespace phpunit\Admin;
class AddonsTest extends \gptest_bootstrap{
private $admin_addons;
public function setUp(){
parent::setUp();
$this->admin_addons = new \gp\admin\Addons([]);
}
public function testAddonExample(){
$this->GetRequest('Admin/Addons');
$this->GetRequest('Admin/Addons/Available');
// make sure the example addon has been detected
$avail = $this->admin_addons->GetAvailAddons();
$this->assertArrayHasKey('Example',$avail);
// install Example
$params = [
'cmd' => 'LocalInstall',
'verified' => \gp\tool\Nonce::Create('post', true),
'source' => 'Example',
];
$this->PostRequest('Admin/Addons',$params);
// make sure the example addon has been installed
\gp\tool::GetConfig();
$installed = $this->admin_addons->GetDisplayInfo();
$this->assertArrayHasKey('Example',$installed);
// uninstall
$params = [
'cmd' => 'confirm_uninstall',
'verified' => \gp\tool\Nonce::Create('post', true),
'addon' => 'Example',
];
$this->PostRequest('Admin/Addons',$params);
\gp\tool::GetConfig();
$installed = $this->admin_addons->GetDisplayInfo();
$this->assertArrayNotHasKey('Example',$installed);
}
}

View file

@ -1,18 +0,0 @@
<?php
namespace phpunit\Admin;
class ErrorTest extends \gptest_bootstrap{
public function testError(){
// create an exception
//$this->expectException('\Exception');
//\gp\tool\Output::InvalidMethod();
$response = $this->GetRequest('Admin/Errors');
}
}

View file

@ -1,89 +0,0 @@
<?php
class phpunit_Export extends gptest_bootstrap{
/**
* Test the export and import admin functionality
*
*/
public function testExport(){
global $wbMessageBuffer, $langmessage;
// load
$this->GetRequest('Admin/Port');
// generate an export
$params = [
'pca' => 'on',
'media' => 'on',
'themes' => 'on',
'trash' => 'on',
'compression' => 'zip',
'verified' => \gp\tool\Nonce::Create('post', true),
'cmd' => 'do_export',
];
$this->PostRequest('Admin/Port',$params);
$archive_path = $this->GetNewExport();
$archive = new \gp\tool\Archive($archive_path);
$list = $archive->ListFiles();
$expected_files = [
'gpexport/data/_pages',
'gpexport/data/_extra',
'gpexport/data/_site',
'gpexport/data/_uploaded',
'gpexport/Export.ini',
];
foreach($expected_files as $expected){
foreach($list as $file){
if( strpos($file['name'],$expected) === false ){
continue;
}
continue 2;
}
echo 'Expected file not found in export. File = '.$expected;
print_r($list);
$this->fail('Expected file not found');
}
// revert
$params = [
'archive' => basename($archive_path),
'verified' => \gp\tool\Nonce::Create('post', true),
'cmd' => 'revert_confirmed',
];
$response = $this->PostRequest('Admin/Port',$params);
if( strpos($response->GetBody(), $langmessage['Revert_Finished']) === false ){
$this->fail('Revert failed');
}
}
/**
* Get the newest export
*
*/
public function GetNewExport(){
global $dataDir;
$dir = $dataDir . '/data/_exports';
$files = scandir($dir, SCANDIR_SORT_DESCENDING);
foreach($files as $file){
if( $file != 'index.html' ){
return $dir.'/'.$file;
}
}
}
}

View file

@ -1,176 +0,0 @@
<?php
namespace phpunit\Admin;
class ExtraTest extends \gptest_bootstrap{
private $admin_extra;
public function setUp(){
parent::setUp();
$this->admin_extra = new \gp\admin\Content\Extra([]);
}
public function testCreateExtra(){
$this->GetRequest('Admin/Extra');
$types = \gp\tool\Output\Sections::GetTypes();
foreach($types as $type => $type_info){
$this->AddType($type);
}
}
public function testEditFooter(){
$this->GetRequest('Admin/Extra/Footer','cmd=EditExtra');
$text = '<p>New Text</p>';
$params = [
'cmd' => 'SaveText',
'verified' => \gp\tool\Nonce::Create('post', true),
'gpcontent' => $text,
];
$this->PostRequest('Admin/Extra/Footer',$params);
// make sure the new text shows in the preview
$response = $this->GetRequest('Admin/Extra/Footer','cmd=PreviewText');
$body = $response->getBody();
$this->assertStrpos( $body, $text );
// make sure the draft exits
$this->admin_extra->GetAreas();
$area_info = $this->admin_extra->ExtraExists('Footer');
$this->assertFileExists($area_info['draft_path']);
// publish draft ... make sure the draft file no longer exists
$params = [
'cmd' => 'PublishDraft',
'verified' => \gp\tool\Nonce::Create('post', true),
];
$this->PostRequest('Admin/Extra/Footer',$params);
$this->assertFileNotExists($area_info['draft_path']);
// make sure the new text still shows
$response = $this->GetRequest('Admin/Extra/Footer','cmd=PreviewText');
$body = $response->getBody();
$this->assertStrpos( $body, $text );
}
/**
* Add an extra area of $type
* @param string $type
*/
public function AddType($type){
$area_count = count($this->admin_extra->areas);
$name = 'new-'.$type;
$params = [
'cmd' => 'NewSection',
'verified' => \gp\tool\Nonce::Create('post', true),
'new_title' => $name,
'type' => $type,
];
$this->PostRequest('Admin/Extra',$params);
$this->admin_extra->GetAreas();
$this->assertEquals( count($this->admin_extra->areas), $area_count + 1 , 'Extra area not added');
// preview
$this->GetRequest('Admin/Extra/' . $name,'cmd=PreviewText');
// delete
$params = [
'cmd' => 'DeleteArea',
'verified' => \gp\tool\Nonce::Create('post', true),
];
$this->PostRequest('Admin/Extra/' . rawurlencode($name),$params);
$this->admin_extra->GetAreas();
$this->assertEquals( count($this->admin_extra->areas), $area_count , 'Extra area not deleted');
}
public function testVisibility(){
$content = \gp\tool\Output\Extra::GetExtra('Header');
// assert the homepage does not contain extra content
$response = $this->GetRequest('');
$body = $response->GetBody();
$this->assertNotStrpos($body,$content);
// add footer extra to bottom of page
// get container query from theme editor
// look for url like http://localhost/index.php/Admin_Theme_Content/Edit/default?cmd=SelectContent&param=QWZ0ZXJDb250ZW50Og_0%7C
$response = $this->GetRequest('Admin_Theme_Content/Edit/default','cmd=in_ifrm');
$body = $response->GetBody();
preg_match('#cmd=SelectContent&amp;param=([^"]+)#',$body,$match);
$param = rawurldecode($match[1]);
// open dialog
// /Admin_Theme_Content/Edit/default?cmd=SelectContent&param=QWZ0ZXJDb250ZW50Og_0%7C
$response = $this->GetRequest('Admin_Theme_Content/Edit/default','cmd=SelectContent&param='.$param);
$body = $response->GetBody();
$count = preg_match_all('#data-cmd="tabs"#',$body);
$this->assertEquals( $count, 4 , 'Tab count didnt match expected');
// add Header
// /Admin_Theme_Content/Edit/default?cmd=addcontent&where=QWZ0ZXJDb250ZW50Og_0%7C&insert=Extra%3AHeader
preg_match('#href="([^"]*)\?([^"]*cmd=addcontent[^"]*insert[^"]*Header[^"]*)"#',$body,$match);
$page = rawurldecode($match[1]);
$query = rawurldecode($match[2]);
$response = $this->GetRequest($page,$query);
// confirm the homepage contains the extra content
$this->UseAnon();
$response = $this->GetRequest('');
$body = $response->GetBody();
$this->assertStrpos($body,$content,'Extra:Header content not found in body');
// change visibility
// /Admin/Extra/Header?cmd=EditVisibility
$this->UseAdmin();
$response = $this->GetRequest('Admin/Extra/Header','EditVisibility');
$params = [
'cmd' => 'SaveVisibilityExtra',
'verified' => \gp\tool\Nonce::Create('post', true),
'visibility_type' => 1,
];
$this->PostRequest('Admin/Extra/Header',$params);
// confirm the homepage does not contain the extra content
$this->UseAnon();
$response = $this->GetRequest('');
$body = $response->GetBody();
$this->assertNotStrpos($body,$content,'Extra:Header content was found in body');
}
}

View file

@ -1,83 +0,0 @@
<?php
namespace phpunit\Admin;
class LayoutTest extends \gptest_bootstrap{
private $admin_layout;
public function setUp(){
parent::setUp();
$this->admin_layout = new \gp\admin\Layout([]);
}
public function testLayout(){
$this->GetRequest('Admin_Theme_Content');
$this->GetRequest('Admin_Theme_Content/Available');
$themes = [
['Bootswatch4_Scss','cerulean'],
['Bootswatch_Scss','Cerulian'],
['Bootswatch_Flatly','1_Starter_Template'],
];
foreach($themes as $theme){
$this->InstallLayout($theme);
}
}
public function InstallLayout($theme){
global $gpLayouts;
\gp\tool::GetPagesPHP();
$layouts_before = $gpLayouts;
$count_before = count($gpLayouts);
$theme_str = $theme[0].'(local)/'. $theme[1];
// install preview
// http://localhost/gpeasy/dev/index.php/Admin_Theme_Content/Available?cmd=preview&theme=Bootswatch_Scss%28local%29%2FCerulian
$this->GetRequest('Admin_Theme_Content/Available','cmd=preview&theme='.rawurlencode($theme_str));
$params = [
'theme' => $theme_str,
'label' => $theme[0].'/'.$theme[1],
'cmd' => 'addlayout',
'verified' => \gp\tool\Nonce::Create('post', true),
];
$this->PostRequest('Admin_Theme_Content/Available',$params);
// confirm we have a new layout in the configuration
\gp\tool::GetPagesPHP();
$this->AssertEquals( $count_before+1, count($gpLayouts) );
$installed = array_diff_key($gpLayouts, $layouts_before);
$layout_key = key($installed);
// delete the layout
// http://localhost/gpeasy/dev/index.php/Admin_Theme_Content?cmd=deletelayout&layout=v9duzd9
$params = [
'layout' => $layout_key,
'cmd' => 'deletelayout',
'verified' => \gp\tool\Nonce::Create('post', true),
];
$this->PostRequest('Admin_Theme_Content',$params);
// confirm we have a new layout in the configuration
\gp\tool::GetPagesPHP();
$this->assertArrayNotHasKey($layout_key,$gpLayouts);
}
}

View file

@ -1,68 +0,0 @@
<?php
namespace phpunit\Admin;
class PermissionsTest extends \gptest_bootstrap{
public function testFilePermissions(){
global $gp_index;
\gp\tool::GetPagesPHP();
$this->CheckEditing('all');
// load form
$this->GetRequest('Admin/Permissions','index=a');
// adding index=a shouldn't change the permissions
$params = [
'verified' => \gp\tool\Nonce::Create('post', true),
'users' => [static::user_name => static::user_name],
'cmd' => 'SaveFilePermissions',
'index' => 'a',
];
$this->PostRequest('/Admin/Permissions',$params);
$this->CheckEditing('all');
// removing index=a
$params = [
'verified' => \gp\tool\Nonce::Create('post', true),
'users' => [],
'cmd' => 'SaveFilePermissions',
'index' => 'a',
];
$expected = array_diff( array_values( $gp_index) , ['a'] );
$expected = ','.implode(',',$expected).',';
$this->PostRequest('/Admin/Permissions',$params);
$this->CheckEditing($expected);
// re-add index=a
$params = [
'verified' => \gp\tool\Nonce::Create('post', true),
'users' => [static::user_name => static::user_name],
'cmd' => 'SaveFilePermissions',
'index' => 'a',
];
$expected = array_values( $gp_index);
$expected = ','.implode(',',$expected).',';
$this->PostRequest('/Admin/Permissions',$params);
$this->CheckEditing($expected);
}
public function CheckEditing($editing_value){
$users = \gp\tool\Files::Get('_site/users');
$this->assertEquals( count($users), 1, 'More than one user found');
$this->assertArrayHasKey(static::user_name, $users,'Default user not found');
$this->assertEquals( $users[static::user_name]['editing'], $editing_value, 'Expected editing value of '.$editing_value.' != '.$users[static::user_name]['editing'] );
}
}

View file

@ -1,92 +0,0 @@
<?php
namespace phpunit\Admin;
class PreferencesTest extends \gptest_bootstrap{
/**
* Test changing the admin user's password
*
*/
public function testChangePassword(){
// password_hash -> password_hash
$params = [
'oldpassword' => self::user_pass,
'password' => 'new-password',
'password1' => 'new-password',
'algo' => 'password_hash',
];
$user_info_1 = $this->GetUserInfo();
$this->ChangePreferences( $params );
$user_info_2 = $this->GetUserInfo();
$this->assertEquals($user_info_2['passhash'], 'password_hash');
$this->assertNotEquals($user_info_1['password'], $user_info_2['password']);
// password_hash -> sha512
$params = [
'oldpassword' => 'new-password',
'password' => 'new-password2',
'password1' => 'new-password2',
'algo' => 'sha512',
];
$this->ChangePreferences( $params );
$user_info_3 = $this->GetUserInfo();
$this->assertEquals($user_info_3['passhash'], 'sha512');
$this->assertNotEquals($user_info_2['password'], $user_info_3['password']);
// sha512 -> password_hash
$params = [
'oldpassword' => 'new-password2',
'password' => self::user_pass,
'password1' => self::user_pass,
'algo' => 'password_hash',
];
$this->ChangePreferences( $params );
$user_info_4 = $this->GetUserInfo();
$this->assertEquals($user_info_4['passhash'], 'password_hash');
$this->assertNotEquals($user_info_3['password'], $user_info_4['password']);
// sha512 -> password_hash
$params = [
'email' => 'test2@typesettercms.com',
];
$this->ChangePreferences( $params );
$user_info_5 = $this->GetUserInfo();
$this->assertEquals($user_info_5['email'], 'test2@typesettercms.com');
}
/**
* Helper function for changing password from old to new
*
*/
public function ChangePreferences( $params ){
$params += [
'verified' => \gp\tool\Nonce::Create('post', true),
'email' => self::user_email,
'oldpassword' => self::user_pass,
'password' => self::user_pass,
'password1' => self::user_pass,
'algo' => 'password_hash',
'cmd' => 'changeprefs',
];
$this->PostRequest('Admin/Preferences',$params);
}
public function GetUserInfo(){
$users = \gp\tool\Files::Get('_site/users');
$this->assertArrayHasKey(static::user_name, $users);
return $users[static::user_name];
}
}

View file

@ -1,20 +0,0 @@
<?php
class phpunit_StatusTest extends gptest_bootstrap{
/**
* Test the admin/status health check
*
*/
public function testStatus(){
$admin_status = new \gp\admin\Tools\Status();
$admin_status->CheckDataDir();
$this->AssertGreaterThan(0,$admin_status->GetValue('passed_count'));
$this->AssertEquals(0,$admin_status->GetValue('failed_count'));
}
}

View file

@ -1,87 +0,0 @@
<?php
namespace phpunit\Admin;
class UploadTest extends \gptest_bootstrap{
public function testUpload(){
global $dataDir;
$file = $dataDir . '/include/imgs/stars.png';
$this->UploadRequest('Admin/Uploaded',$file);
// confirm the uploaded file exists
$upload = $dataDir.'/data/_uploaded/image/stars.png';
$thumb = $dataDir.'/data/_uploaded/image/thumbnails/image/stars.png.jpg';
$this->assertFileExists($upload);
$this->assertFileExists($thumb);
// delete the file
$params = [
'file_cmd' => 'delete',
'show' => 'inline',
'file' => 'stars.png',
'verified' => \gp\tool\Nonce::Create('post', true),
];
$this->PostRequest('Admin/Uploaded/image',$params);
$this->assertFileNotExists($upload);
$this->assertFileNotExists($thumb);
}
public function testInvalidUpload(){
global $dataDir;
$file = $dataDir . '/include/main.php';
$upload = $dataDir.'/data/_uploaded/image/main.php';
$this->UploadRequest('Admin/Uploaded',$file);
$this->assertFileNotExists($upload);
}
/**
* Send a POST request to the test server
*
*/
public static function UploadRequest($slug, $file){
$url = \gp\tool::GetUrl($slug);
$options = [
'multipart' => [
[
'name' => 'userfiles[]',
'contents' => file_get_contents($file),
'filename' => basename($file)
],
[
'name' => 'MAX_FILE_SIZE',
'contents' => 2097152,
],
[
'name' => 'file_cmd',
'contents' => 'inline_upload',
],
[
'name' => 'dir',
'contents' => '/image',
],
[
'name' => 'verified',
'contents' => \gp\tool\Nonce::Create('post', true),
],
[
'name' => 'output',
'contents' => 'gallery',
],
],
];
return self::GuzzleRequest('POST',$url,200,$options);
}
}

View file

@ -1,98 +0,0 @@
<?php
namespace phpunit\Admin;
class UsersTest extends \gptest_bootstrap{
/**
* Test add and deleting users
*
*/
public function testNewUser(){
$this->GetRequest('Admin/Users');
$this->GetRequest('/Admin/Users','cmd=newuserform');
$users = \gp\tool\Files::Get('_site/users');
$this->assertEquals( count($users), 1, 'More than one user found');
// create the new user
$params = [
'verified' => \gp\tool\Nonce::Create('post', true),
'username' => 'newuser',
'password' => 'newpass',
'password1' => 'newpass',
'algo' => 'password_hash',
'email' => 'test2@typesettercms.com',
'grant_all' => 'all',
'editing_all' => 'all',
'cmd' => 'CreateNewUser',
];
$this->PostRequest('/Admin/Users',$params);
$users = \gp\tool\Files::Get('_site/users');
$user_info = $users['newuser'];
$this->assertEquals( count($users), 2);
$this->assertEquals( $user_info['granted'], 'all');
$this->assertEquals( $user_info['editing'], 'all');
$this->assertEquals( $user_info['email'], 'test2@typesettercms.com');
// edit user details
$params = [
'verified' => \gp\tool\Nonce::Create('post', true),
'username' => 'newuser',
'email' => 'test3@typesettercms.com',
'grant_all' => '',
'editing_all' => '',
'cmd' => 'SaveChanges',
];
$this->GetRequest('/Admin/Users','cmd=details&username=newuser');
$this->PostRequest('/Admin/Users',$params);
$users = \gp\tool\Files::Get('_site/users');
$user_info = $users['newuser'];
$this->assertEquals( $user_info['granted'], '');
$this->assertEquals( $user_info['editing'], '');
$this->assertEquals( $user_info['email'], 'test3@typesettercms.com');
// change password
$params = [
'verified' => \gp\tool\Nonce::Create('post', true),
'username' => 'newuser',
'password' => 'resetpass',
'password1' => 'resetpass',
'algo' => 'password_hash',
'cmd' => 'resetpass',
];
$this->GetRequest('/Admin/Users','cmd=changepass&username=newuser');
$this->PostRequest('/Admin/Users',$params);
$users = \gp\tool\Files::Get('_site/users');
$user_info2 = $users['newuser'];
$this->assertNotEquals( $user_info2['password'],$user_info['password'],'Password reset failed');
// delete user
$params = [
'cmd' => 'RemoveUser',
'username' => 'newuser',
'verified' => \gp\tool\Nonce::Create('post', true),
];
$this->PostRequest('/Admin/Users',$params);
$users = \gp\tool\Files::Get('_site/users');
$this->assertEquals( count($users), 1,'Failed removing user');
$this->assertArrayHasKey(static::user_name, $users);
}
}

View file

@ -1,27 +0,0 @@
<?php
class phpunit_Languages extends gptest_bootstrap{
function testKeys(){
global $langmessage, $languages;
//get en language
\gp\tool::GetLangFile('main.inc','en');
$keys_en = array_keys($langmessage);
//compare keys in other languages
foreach($languages as $code => $lang){
$langmessage = array();
\gp\tool::GetLangFile('main.inc',$code);
$keys = array_keys($langmessage);
$diff = array_diff($keys_en,$keys);
self::assertEmpty($diff,'Keys missing in '.$lang.' ('.$code.') language file: '.pre($diff));
}
}
}

View file

@ -1,142 +0,0 @@
<?php
class phpunit_Update extends gptest_bootstrap{
private $FileSystem;
/**
*
*/
function testUpdate(){
$this->UpdateOutputTest();
$this->UpdateFilesystem();
$this->UpdatePackageInfo();
$this->DownloadSource();
$this->UnpackAndSort();
$this->ReplaceDirs();
}
/*
static function AssertTrue($condition, $msg = '' ){
global $page;
if( $condition !== true && $page->update_msgs ){
echo "\n --".implode("\n --",$page->update_msgs);
}
parent::assertTrue($condition,$msg);
}
*/
/**
* Very rough integration test of the updater
* Passes if no errors are thrown
* Also defines $page for subsequent tests
*
*/
function UpdateOutputTest(){
global $page;
$url = '/include/install/update.php';
$response = static::GuzzleRequest('GET',$url);
ob_start();
$page = new \gp\admin\Update();
//\gp\tool\Output::HeadContent();
//includeFile('install/update_template.php');
ob_get_clean();
}
/**
* Filesystem method detection
*
*/
function UpdateFilesystem(){
global $page;
$filesystem_method = $page->DetectFileSystem();
self::AssertEquals($filesystem_method,'gp_filesystem_direct');
$this->FileSystem = \gp\tool\FileSystem::set_method('gp_filesystem_direct');
}
/**
* Getting package info from gpeasy
*
*/
function UpdatePackageInfo(){
global $page;
$success = $page->DoRemoteCheck2();
self::AssertTrue($success,'DoRemoteCheck2 Failed');
}
/**
* Make sure we can get the new source from gpeasy
*
*/
function DownloadSource(){
global $page;
$success = $page->DownloadSource();
self::AssertTrue($success,'Download Source Failed');
}
/**
* Make sure the unzip and file replacement works
*
*/
function UnpackAndSort(){
global $page;
$success = $page->UnpackAndSort($page->core_package['file']);
self::AssertTrue($success,'UnpackAndSort Failed');
}
/**
* Make sure we can replace the directories
*
*/
function ReplaceDirs(){
global $page;
$extra_dirs = array();
$success = $this->FileSystem->ReplaceDirs( $page->replace_dirs, $extra_dirs );
print_r($page->replace_dirs);
self::AssertTrue($success,'ReplaceDirs Failed');
if( !$success ){
return;
}
//remove what we just installed
$remove = array_keys($page->replace_dirs);
$this->FileSystem->CleanUpFolders($remove, $not_deleted);
//reverse it
$replace_dirs = $extra_dirs;
$extra_dirs = array();
$success = $this->FileSystem->ReplaceDirs( $replace_dirs, $extra_dirs );
self::AssertTrue($success,'ReplaceDirs Failed (2)');
}
}

View file

@ -1,42 +0,0 @@
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
if( class_exists('\SebastianBergmann\CodeCoverage\CodeCoverage') ){
$include_dir = dirname(__DIR__).'/include';
$cov_obj = new \SebastianBergmann\CodeCoverage\CodeCoverage();
$cov_obj->filter()->addDirectoryToWhitelist($include_dir);
$cov_obj->filter()->removeDirectoryFromWhitelist($include_dir.'/thirdparty');
$cov_dir = dirname(__DIR__).'/x_coverage';
$files = scandir($cov_dir);
$file_count = 0;
foreach($files as $file){
if( $file === '.' || $file === '..' ){
continue;
}
if( strpos($file,'request-') !== 0 ){
echo "\n - invalid coverage file: ".$file;
continue;
}
echo "\n - coverage file: ".$file;
$file = $cov_dir.'/'.$file;
$data = json_decode( file_get_contents($file),true );
$cov_obj->append($data, $file );
$file_count++;
}
echo "\n - ".$file_count.' coverage files combined in '.$cov_dir;
echo "\n";
$cov_file = $cov_dir.'/requests.clover';
$writer = new \SebastianBergmann\CodeCoverage\Report\Clover;
$writer->process($cov_obj, $cov_file);
}

View file

@ -1,29 +0,0 @@
<?php
/**
* Start xdebug code coverage
* Register autoload for merging coverage with php-code-coverage
* https://stackoverflow.com/questions/10167775/aggregating-code-coverage-from-several-executions-of-phpunit
*
*/
defined('gp_unit_testing') or define('gp_unit_testing',true);
defined('gpdebug') or define('gpdebug',true); // sets error_reporting(ALL)
if( function_exists('xdebug_start_code_coverage') ){
xdebug_start_code_coverage();
function SaveXdebugCoverage(){
$cov_dir = dirname(__DIR__).'/x_coverage';
$name = str_replace('/','-','request-'.$_SERVER['HTTP_X_REQ_ID'].'-'.$_SERVER['REQUEST_METHOD'].'-'.$_SERVER['REQUEST_URI']);
$cov_file = $cov_dir.'/'.$name.'.json';
$data = xdebug_get_code_coverage();
file_put_contents( $cov_file, json_encode($data,JSON_PRETTY_PRINT));
}
register_shutdown_function('SaveXdebugCoverage');
ob_start(function($buffer){
SaveXdebugCoverage();
return $buffer;
});
}

View file

@ -1,21 +0,0 @@
<?php
if( !class_exists('\PHPUnit_Framework_BaseTestListener') ){
if( class_exists('\PHPUnit\Framework\TestListener') ){
class_alias('\PHPUnit\Framework\TestListener', '\PHPUnit_Framework_BaseTestListener');
}else{
throw new \Exception('\PHPUnit\Framework\TestListener class doesnt exist');
}
}
class ServerSetup extends PHPUnit_Framework_BaseTestListener{
public function startTestSuite($suite){
echo pre('start test suite');
}
public function endTestSuite($suite){
echo pre('end test suite');
}
}

View file

@ -1,29 +0,0 @@
<?php
namespace phpunit\Admin;
class MissingTest extends \gptest_bootstrap{
public function test404(){
$this->UseAnon();
$url = \gp\tool::GetUrl( 'a-missing-page','',false);
self::GuzzleRequest('GET',$url,404);
}
public function testRedir(){
$this->UseAnon();
$options = ['allow_redirects'=>false];
$url = \gp\tool::GetUrl( 'Child_Pag','',false);
$response = self::GuzzleRequest('GET', $url, 302, $options);
$location = $response->getHeader('Location');
$this->AssertEquals($location[0],'/index.php/Child_Page');
}
}

View file

@ -1,222 +0,0 @@
<?php
/**
* Test the gp\tool\Archive class
*
*/
class phpunit_Archive extends gptest_bootstrap{
private $dir;
private $types = [
'tbz' => 'PharData',
'tgz' => 'PharData',
'tar' => 'PharData',
'zip' => 'ZipArchive',
'tar.bz' => 'PharData',
'tar.gz' => 'PharData',
];
private $files = [
'index.html' => '<html><body></body></html>',
'foo/text.txt' => 'lorem ipsum',
'foo/index.html' => '<html><body></body></html>',
'/foo/bar' => 'foo bar',
'foo/unicode/index.html' => '<html><body></body></html>',
// unicode isn't supported by pharData until php 5.4.29/5.5.13/5.6.0
//'foo/unicode/Kødpålæg.tst' => 'Die style.css hatte ich an dieser Stelle zuvor nicht überarbeitet.',
];
/**
* Create the files and folders
*
*/
function setUp(){
global $dataDir;
// HHVM doesn't support writing with PHAR
// https://github.com/facebook/hhvm/issues/4899
if( defined('HHVM_VERSION') ){
$this->types = ['zip'=>'ZipArchive'];
}
$this->dir = $dataDir.'/data/test-'.rand(1,10000000);
foreach($this->files as $name => $content){
$full = $this->dir.'/'.$name;
\gp\tool\Files::Save($full,$content);
}
}
/**
* Test creation
*
*/
function testCreate(){
foreach($this->types as $type => $expected_class){
if( !class_exists($expected_class) ){
$this->markTestIncomplete('missing archive class '.$expected_class);
continue;
}
$archive = $this->FromFiles($type);
//$list = $archive->ListFiles();
self::AssertEquals( count($this->files), $archive->Count() );
}
}
/**
* Test archive creation from string
*
*/
function testCreateString(){
foreach($this->types as $type => $expected_class){
if( !class_exists($expected_class) ){
$this->markTestIncomplete('missing archive class '.$expected_class);
continue;
}
$archive = $this->FromString($type);
self::AssertEquals( count($this->files), $archive->Count() );
}
}
/**
* Extract from a tar archive
*
*/
function testExtract(){
foreach($this->types as $type => $expected_class){
if( !class_exists($expected_class) ){
$this->markTestIncomplete('missing archive class '.$expected_class);
continue;
}
$archive = $this->FromString($type);
foreach($this->files as $name => $content){
$extracted = $archive->getFromName($name);
self::AssertEquals($content, $extracted );
}
}
}
/**
* Test ListFiles()
*
*/
function testListFiles(){
foreach($this->types as $type => $expected_class){
if( !class_exists($expected_class) ){
$this->markTestIncomplete('missing archive class '.$expected_class);
continue;
}
$archive = $this->FromString($type);
$list = $archive->ListFiles();
self::AssertEquals( count($list), count($this->files) );
}
}
/**
* Test GetRoot()
*
*/
function testGetRoot(){
foreach($this->types as $type => $expected_class){
if( !class_exists($expected_class) ){
$this->markTestIncomplete('missing archive class '.$expected_class);
continue;
}
$archive = $this->FromString($type);
$root = $archive->GetRoot('text.txt');
self::AssertEquals( 'foo', $root );
}
}
/**
* Create an archive, add a file using AddFromString()
*
*/
function FromString($type){
$path = $this->ArchivePath($type);
try{
$archive = new \gp\tool\Archive($path);
foreach($this->files as $name => $content){
$archive->addFromString($name, $content);
}
}catch( Exception $e){
self::AssertTrue( false, 'FromString('.$type.') Failed with message: '.$e->getMessage() );
return;
}
$archive->Compress();
self::AssertFileExists( $path );
//return a readable archive
$path2 = $this->ArchivePath($type);
copy($path,$path2);
return new \gp\tool\Archive($path2);
}
/**
* Create archive from files
*
*/
function FromFiles($type){
$path = $this->ArchivePath($type);
$expected_class = $this->types[$type];
try{
$archive = new \gp\tool\Archive($path);
}catch( Exception $e){
self::AssertTrue( false, 'FromFiles('.$type.') Failed with message: '.$e->getMessage() );
return;
}
self::assertInstanceOf($expected_class,$archive->GetObject(),'Archive object is not '.$this->types[$type].' for type '.$type);
$archive->Add($this->dir);
$archive->Compress();
self::AssertFileExists( $path );
return new \gp\tool\Archive($path); //return a readable archive
}
function ArchivePath($type){
global $dataDir;
return $dataDir . '/data/archive-'.rand(0,100000).'.'.$type;
}
}

View file

@ -1,15 +0,0 @@
<div class=test>foo</div>
<div class='te"st'>foo</div>
<div class="te&quot; st">foo</div>
<div class='te&#039; st'>foo</div>
<div id="id" attr= >foo</div>
<input type="text" disabled />
<div style="display: block; background: url('this.jpg') repeat scroll 0% 0% transparent;"> </div>
<img alt="" src="/img/path" />

View file

@ -1,15 +0,0 @@
<div class="test">foo</div>
<div class="te&quot;st">foo</div>
<div class="te&quot; st">foo</div>
<div class="te&#039; st">foo</div>
<div id="id" attr>foo</div>
<input type="text" disabled />
<div style="display: block; background: url('this.jpg') repeat scroll 0% 0% transparent;"> </div>
<img alt="" src="/img/path" />

View file

@ -1,4 +0,0 @@
<div class="test">
<B>a div</B>
<a href="#" onclick="javascript:alert('this')">alert</a>
</div>

View file

@ -1,4 +0,0 @@
<div class="test">
<b>a div</b>
<a href="#" onclick="javascript:alert('this')">alert</a>
</div>

View file

@ -1,13 +0,0 @@
<!-- comment -->
<div class="test">filler html</div>
<!-- <div> commented html </div> -->
<div class="test">filler html</div>
<!------- <div attr="blah"> commented html </div> ------->
<div class="test">filler html</div>
<!--div commented --->

View file

@ -1,13 +0,0 @@
<!-- comment -->
<div class="test">filler html</div>
<!-- <div> commented html </div> -->
<div class="test">filler html</div>
<!------- <div attr="blah"> commented html </div> ------->
<div class="test">filler html</div>
<!--div commented --->

View file

@ -1,6 +0,0 @@
<div>filler html</div>
< and some text
<div

View file

@ -1,6 +0,0 @@
<div>filler html</div>
&lt; and some text
<div>

View file

@ -1,13 +0,0 @@
<div class="script-wrap">
<script> </script>
<script>var a = "</script>";
var b = "<script>";
//this is a quote
</SCript>
</div>

View file

@ -1,13 +0,0 @@
<div class="script-wrap">
<script> </script>
<script>var a = "</script>";
var b = "<script>";
//this is a quote
</script>
</div>

View file

@ -1,13 +0,0 @@
<div class="editable_area filetype-text" id="someid" >filler html</div>
<div class="foo ExtraEditLink" id="someid">filler html</div>
<div class="ExtraEditLink" id="someid">filler html</div>
<div class="foo ExtraEditLnks" id="someid">filler html</div>
<div class="ExtraEditLnks" id="someid">filler html</div>
<div class="gp_nosave">will be removed</div>

View file

@ -1,13 +0,0 @@
<div>filler html</div>
<div>filler html</div>
<div>filler html</div>
<div>filler html</div>
<div>filler html</div>

View file

@ -1,8 +0,0 @@
<div class="style-wrap">
<style type="text/css">
.test:after{
content:'</div><div>';
}
</style>
</div>

View file

@ -1,8 +0,0 @@
<div class="style-wrap">
<style type="text/css">
.test:after{
content:'</div><div>';
}
</style>
</div>

View file

@ -1,57 +0,0 @@
<?php
/**
* Test the \gp\tool\Editing\HTML
*
*/
class phpunit_HTML extends gptest_bootstrap{
private $dir;
function setUp(){
$this->dir = __DIR__ . '/HtmlFixtures';
}
/**
* Loop through all the files in the /HtmlFixtures directory
* Test each *.from.html file with *.to.html
*
*/
function testHTML(){
$files = scandir($this->dir);
foreach($files as $file){
if( strpos($file,'.from.html') === false ){
continue;
}
$parts = explode('.',$file);
$name = array_shift($parts);
$this->CheckHtml($name);
}
}
/**
* Compare the results of parsing a *.from.html file with the contents of a *.to.html file
*
*/
function CheckHtml($name){
$path_from = $this->dir.'/'.$name.'.from.html';
$path_to = $this->dir.'/'.$name.'.to.html';
$from_html = file_get_contents($path_from);
$to_html = file_get_contents($path_to);
$gp_html_output = new \gp\tool\Editing\HTML($from_html);
self::AssertEquals( $to_html, $gp_html_output->result );
}
}

View file

@ -1,484 +0,0 @@
<?php
echo "\n************************************************************************************";
echo "\nBegin gpEasy Tests\n\n";
defined('gpdebug') or define('gpdebug',true);
defined('is_running') or define('is_running',true);
defined('gp_unit_testing') or define('gp_unit_testing',true);
defined('gp_nonce_algo') or define('gp_nonce_algo','sha512');
error_reporting(E_ALL); // 32767
if (!class_exists('\PHPUnit_Framework_TestCase') && class_exists('\PHPUnit\Framework\TestCase'))
class_alias('\PHPUnit\Framework\TestCase', '\PHPUnit_Framework_TestCase');
class gptest_bootstrap extends \PHPUnit_Framework_TestCase{
protected static $process;
protected static $client_user; // guzzle client for making anonymous user requests
protected static $client_admin; // guzzle client for making admin user requests
protected static $client_current;
protected static $is_admin = false;
protected static $requests = 0;
protected static $proc_output = [];
protected static $phpinfo;
protected static $tracking = [];
const user_name = 'phpunit_username';
const user_pass = 'phpunit-test-password';
const user_email = 'test@typesettercms.com';
static function log($msg){
static $fp;
if( !$fp ){
$log = __DIR__ . '/phpunit.log';
$fp = fopen($log, 'a');
}
fwrite($fp, "\n".print_r($msg, TRUE));
}
public function setUp(){
self::UseAdmin();
}
/**
* Use php's built-in web server
* https://medium.com/@peter.lafferty/start-phps-built-in-web-server-from-phpunit-9571f38c5045
*
*/
public static function setUpBeforeClass(){
if( function_exists('showError') ){
return;
}
self::Console('Start server, set phpinfo...');
self::PrepInstall();
self::StartServer();
// create client for user requests
self::$client_user = new \GuzzleHttp\Client(['http_errors' => false,'cookies' => true]);
// create client for admin requests
self::$client_admin = new \GuzzleHttp\Client(['http_errors' => false,'cookies' => true]);
self::UseAdmin();
self::Install();
\gp\tool::GetLangFile();
self::LogIn();
$url = '/phpinfo.php';
$response = self::GuzzleRequest('GET',$url);
$body = $response->getBody();
self::$phpinfo = (string)$body;
}
public static function StartServer(){
global $dataDir;
$proc = ['php','-S','localhost:8081'];
// doc root
$proc[] = '-t';
$proc[] = $dataDir; // '.';
// error log
$proc[] = '-d';
$proc[] = 'error_log='.$dataDir . '/data/request-errors.log';
// xdebug configuration to collect code coverage
//$proc[] = '-c';
//$proc[] = __DIR__ . '/phpconfig.ini';
$proc[] = '-d';
$proc[] = 'auto_prepend_file='.__DIR__ . '/ServerPrepend.php';
// xdebug profiling
/*
$profile_dir = sys_get_temp_dir().'/test-profiler';
if( file_exists($profile_dir) ){
\gp\tool\Files::RmAll($profile_dir);
}
mkdir($profile_dir);
$proc[] = '-d';
$proc[] = 'xdebug.profiler_enable=1';
$proc[] = '-d';
$proc[] = 'xdebug.profiler_output_dir='.$profile_dir;
*/
self::$process = new \Symfony\Component\Process\Process($proc);
self::$process->start(function($type,$buffer){
self::$proc_output[] = ['type'=>$type,'buffer'=>(string)$buffer];
});
usleep(100000); //wait for server to get going
register_shutdown_function(function(){
self::Console('Stopping server process');
gptest_bootstrap::$process->stop();
usort(self::$tracking,function($a,$b){
if( $a['time'] == $b['time'] ){
return 0;
}
return ($a['time'] < $b['time']) ? 1 : -1;
});
self::Console('Slowest requests (the slowest will usually be because of scss compilation');
self::$tracking = array_slice(self::$tracking,0,5);
foreach(self::$tracking as $req){
self::Console(' - '.$req['url'].' in '.$req['class'].' took '.$req['time']);
}
});
}
/**
* Switch current guzzle client to $client_admin
*/
public static function UseAdmin(){
self::$client_current = self::$client_admin;
self::$is_admin = true;
}
/**
* Switch current guzzle client to $client_user
*/
public static function UseAnon(){
self::$client_current = self::$client_user;
self::$is_admin = false;
}
/**
* Print process output
*
*/
public static function ProcessOutput($type,$url){
echo "\n\n----------------------------------------------------------------";
self::Console('Begin Process Output: '.$type.' '.$url);
echo "\n";
if( !empty(self::$proc_output) ){
self::Console('Proc Output');
print_r(self::$proc_output);
}
echo "\nEnd Process Output\n----------------------------------------------------------------\n\n";
}
/**
* Send a GET request to the test server
*
*/
public static function GetRequest( $slug, $query='', $nonce_action=false ){
$url = \gp\tool::GetUrl( $slug, $query, false, $nonce_action);
return self::GuzzleRequest('GET',$url);
}
/**
* Send a POST request to the test server
*
*/
public static function PostRequest($slug, $params = []){
$url = \gp\tool::GetUrl($slug);
$options = ['form_params' => $params];
return self::GuzzleRequest('POST',$url,200,$options);
}
/**
* Send a request to the test server and check the response
*
*/
public static function GuzzleRequest($type,$url,$expected_resonse = 200, $options = []){
global $dataDir;
$start = microtime(true);
$response = null;
$debug_file = $dataDir . '/data/response-' . self::$requests . '-anon-' . $type . '-' . str_replace('/','_',$url);
if( self::$is_admin ){
$debug_file = $dataDir . '/data/response-' . self::$requests . '-admin-' . $type . '-' . str_replace('/','_',$url);
}
$tracking = [
'url' => $url,
'is_admin' => self::$is_admin,
'class' => get_called_class(),
];
try{
self::$proc_output = [];
$options['headers'] = ['X-REQ-ID' => self::$requests,'Connection'=>'close'];
$url = 'http://localhost:8081' . $url;
$response = self::$client_current->request($type, $url, $options);
$body = $response->getBody();
$status = $response->getStatusCode();
file_put_contents($debug_file, $body);
self::$requests++;
self::$process->getOutput(); # makes symfony/process populate our self::$proc_output
if( $expected_resonse !== $status ){
self::ProcessOutput($type,$url);
self::Console('PHPINFO()');
echo (string)self::$phpinfo;
}
self::assertEquals($expected_resonse, $status);
// make sure the response doesn't have <div id="gp_admin_html">
if( self::$is_admin === false ){
self::assertNotStrpos($body,'gp_admin_html');
}
self::ServerErrors($type,$url);
}catch( \Exception $e ){
self::ServerErrors($type,$url);
self::Fail('Exception fetching url '.$url.$e->getMessage());
}
$tracking['time'] = microtime(true) - $start;
self::$tracking[] = $tracking;
return $response;
}
/**
* Output Error log
*
*/
public static function ServerErrors($type,$url){
global $dataDir;
$error_log = $dataDir . '/data/request-errors.log';
if( !file_exists($error_log) ){
return;
}
$content = file_get_contents($error_log);
if( empty($content) ){
return;
}
echo "\n\n----------------------------------------------------------------";
self::Console('Error Log for '.$type.' '.$url);
echo "\n";
echo $content;
echo "\n\nEnd Error Log\n----------------------------------------------------------------\n\n";
$fp = fopen($error_log, "r+");
ftruncate($fp, 0);
fclose($fp);
self::assertEmpty($content,'php error log was not empty');
}
/**
* Log In
*
*/
public static function LogIn(){
// load login page to set cookies
$response = self::GetRequest('Admin');
$params = [];
$params['cmd'] = 'login';
$params['username'] = self::user_name;
$params['password'] = self::user_pass;
$params['login_nonce'] = \gp\tool\Nonce::Create('login_nonce',true,300);
$response = self::PostRequest('Admin',$params);
}
/**
* Create an install folder in the temporary directory
*
*/
public static function PrepInstall(){
global $dataDir, $languages, $config;
// get a clean temporary install folder
$dataDir = sys_get_temp_dir().'/typesetter-test';
$old_dir = sys_get_temp_dir().'/typesetter-test-old';
if( file_exists($dataDir) ){
rename($dataDir,$old_dir);
}
mkdir($dataDir);
mkdir($dataDir.'/data');
// create symlinks of include, addons, and themes
$symlinks = ['include','addons','themes','gpconfig.php','index.php','vendor'];
foreach($symlinks as $name){
$path = $dataDir.'/'.$name;
$target = $_SERVER['PWD'].'/'.$name;
if( !file_exists($target) ){
self::Console('symlink target does not exist: '. $target);
continue;
}
if( file_exists($path) ){
unlink($path);
}
symlink( $target, $path);
}
// create a phpinfo.php file
$file = $dataDir.'/phpinfo.php';
$content = '<?php phpinfo();';
file_put_contents($file,$content);
include('include/common.php');
spl_autoload_register( array('\\gp\\tool','Autoload') );
require dirname(__DIR__) . '/vendor/autoload.php';
includeFile('tool/functions.php');
self::Console('datadir = '.$dataDir);
self::Console('gp_data_type = '.gp_data_type);
// delete old installation
\gp\tool\Files::RmAll($old_dir);
// reset coverage folder
$cov_dir = dirname(__DIR__).'/x_coverage';
if( file_exists($cov_dir) ){
self::Console('resetting coverage folder: '.$cov_dir);
\gp\tool\Files::RmAll($cov_dir);
}
mkdir($cov_dir);
}
/**
* Output a string to the console
*
*/
public static function Console($msg){
echo "\n";
echo "\e[0;32m";
echo $msg;
echo "\e[0m";
echo "\n";
}
/*
* Create an installation
*
*/
public static function Install(){
global $config;
//make sure it's not installed
$installed = \gp\tool::Installed();
self::AssertFalse($installed,'Cannot test installation (Already Installed)');
// test install checks
// one of the checks actually fails
$values = [1,1,-1,1,1,1];
$installer = new \gp\install\Installer();
foreach($values as $i => $val){
self::assertGreaterThanOrEqual( $val, $installer->statuses[$i]['can_install'], 'Unexpected status ('.$i.') '.pre($installer->statuses[$i]) );
}
// test rendering of the install template
$response = self::GetRequest('');
//ob_start();
//includeFile('install/install.php');
//$installer->Form_Entry();
//$content = ob_get_clean();
//self::assertNotEmpty($content);
//attempt to install
$params = [];
$params['site_title'] = 'unit tests';
$params['email'] = self::user_email;
$params['username'] = self::user_name;
$params['password'] = self::user_pass;
$params['password1'] = self::user_pass;
$params['cmd'] = 'Install';
$response = self::PostRequest('',$params);
//double check
$installed = \gp\tool::Installed();
self::AssertTrue($installed,'Not installed');
\gp\tool::GetConfig();
}
public static function assertStrpos( $haystack, $needle , $msg = 'String not found' ){
if( strpos($haystack, $needle) === false ){
self::fail($msg);
}
}
public static function assertNotStrpos( $haystack, $needle , $msg = 'String found' ){
if( strpos($haystack, $needle) !== false ){
self::fail($msg);
}
}
}

View file

@ -1 +0,0 @@

View file

@ -1,6 +0,0 @@
#xdebug.remote_enable = On
#xdebug.remote_autostart = On
#auto_prepend_file = 'ServerPrepend.php'
#auto_append_file = 'ServerAppend.php'