Merge branch '2021.03-rc' into copyright-2021
This commit is contained in:
commit
befc2af504
22 changed files with 41829 additions and 40547 deletions
182
LICENSE
182
LICENSE
|
@ -1,23 +1,7 @@
|
|||
Friendica Communications Server
|
||||
Copyright (c) 2010-2020 the Friendica Project
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
@ -100,7 +84,7 @@ computer or modifying a private copy. Propagation includes copying,
|
|||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a wok means any kind of propagation that enables other
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
|
@ -204,7 +188,63 @@ appropriately publish on each copy an appropriate copyright notice;
|
|||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with t
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
|
@ -393,7 +433,47 @@ covered work, you indicate your acceptance of this License to do so.
|
|||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
E to
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
|
@ -489,7 +569,63 @@ address new problems or concerns.
|
|||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version orch source file to most effectively
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
|
@ -507,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
|
@ -522,4 +658,4 @@ specific requirements.
|
|||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
|
|
@ -86,7 +86,7 @@ class JitConfig extends BaseConfig
|
|||
$dbvalue = $this->configModel->get($cat, $key);
|
||||
|
||||
if (isset($dbvalue)) {
|
||||
$this->configCache->set($cat, $key, $dbvalue);
|
||||
$this->configCache->set($cat, $key, $dbvalue, Cache::SOURCE_DB);
|
||||
unset($dbvalue);
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ class JitConfig extends BaseConfig
|
|||
public function set(string $cat, string $key, $value)
|
||||
{
|
||||
// set the cache first
|
||||
$cached = $this->configCache->set($cat, $key, $value);
|
||||
$cached = $this->configCache->set($cat, $key, $value, Cache::SOURCE_DB);
|
||||
|
||||
// If there is no connected adapter, we're finished
|
||||
if (!$this->configModel->isConnected()) {
|
||||
|
|
|
@ -81,7 +81,7 @@ class PreloadConfig extends BaseConfig
|
|||
if ($this->configModel->isConnected()) {
|
||||
$config = $this->configModel->get($cat, $key);
|
||||
if (isset($config)) {
|
||||
$this->configCache->set($cat, $key, $config);
|
||||
$this->configCache->set($cat, $key, $config, Cache::SOURCE_DB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ class PreloadConfig extends BaseConfig
|
|||
}
|
||||
|
||||
// set the cache first
|
||||
$cached = $this->configCache->set($cat, $key, $value);
|
||||
$cached = $this->configCache->set($cat, $key, $value, Cache::SOURCE_DB);
|
||||
|
||||
// If there is no connected adapter, we're finished
|
||||
if (!$this->configModel->isConnected()) {
|
||||
|
@ -133,4 +133,18 @@ class PreloadConfig extends BaseConfig
|
|||
|
||||
return $cacheRemoved || $storeRemoved;
|
||||
}
|
||||
|
||||
public function testSetDouble()
|
||||
{
|
||||
$this->configModel->shouldReceive('isConnected')
|
||||
->andReturn(true);
|
||||
|
||||
// constructor loading
|
||||
$this->configModel->shouldReceive('load')
|
||||
->with('config')
|
||||
->andReturn(['config' => ['test' => 'it']])
|
||||
->once();
|
||||
|
||||
parent::testSetDouble();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -133,9 +133,9 @@ class Installer
|
|||
$returnVal = false;
|
||||
}
|
||||
|
||||
if (!$this->checkHtAccess($baseurl)) {
|
||||
$returnVal = false;
|
||||
}
|
||||
/// @TODO This check should not block installations because of containerization issues
|
||||
/// @see https://github.com/friendica/docker/issues/134
|
||||
$this->checkHtAccess($baseurl);
|
||||
|
||||
return $returnVal;
|
||||
}
|
||||
|
|
|
@ -95,8 +95,7 @@ class Invite extends BaseModule
|
|||
$nmessage = $message;
|
||||
}
|
||||
|
||||
$additional_headers = 'From: ' . $app->user['email'] . "\n"
|
||||
. 'Sender: ' . DI::emailer()->getSiteEmailAddress() . "\n"
|
||||
$additional_headers = 'From: "' . $app->user['email'] . '" <' . DI::emailer()->getSiteEmailAddress() . ">\n"
|
||||
. 'Content-type: text/plain; charset=UTF-8' . "\n"
|
||||
. 'Content-transfer-encoding: 8bit';
|
||||
|
||||
|
|
|
@ -1330,7 +1330,7 @@ class Transmitter
|
|||
return $match[0];
|
||||
}
|
||||
|
||||
return '[url=' . ($data['alias'] ?: $data['url']) . ']@' . $data['nick'] . '[/url]';
|
||||
return '[url=' . $data['url'] . ']@' . $data['nick'] . '[/url]';
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -103,6 +103,28 @@ abstract class AbstractLogger implements LoggerInterface
|
|||
return strtr($message, $replace);
|
||||
}
|
||||
|
||||
/**
|
||||
* JSON Encodes an complete array including objects with "__toString()" methods
|
||||
*
|
||||
* @param array $input an Input Array to encode
|
||||
*
|
||||
* @return false|string The json encoded output of the array
|
||||
*/
|
||||
protected function jsonEncodeArray(array $input)
|
||||
{
|
||||
$output = [];
|
||||
|
||||
foreach ($input as $key => $value) {
|
||||
if (method_exists($value, '__toString')) {
|
||||
$output[$key] = $value->__toString();
|
||||
} else {
|
||||
$output[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return @json_encode($output);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -161,8 +161,8 @@ class StreamLogger extends AbstractLogger
|
|||
$logMessage .= $this->channel . ' ';
|
||||
$logMessage .= '[' . strtoupper($level) . ']: ';
|
||||
$logMessage .= $this->psrInterpolate($message, $context) . ' ';
|
||||
$logMessage .= @json_encode($context) . ' - ';
|
||||
$logMessage .= @json_encode($record);
|
||||
$logMessage .= $this->jsonEncodeArray($context) . ' - ';
|
||||
$logMessage .= $this->jsonEncodeArray($record);
|
||||
$logMessage .= PHP_EOL;
|
||||
|
||||
return $logMessage;
|
||||
|
|
|
@ -195,8 +195,8 @@ class SyslogLogger extends AbstractLogger
|
|||
$logMessage .= $this->channel . ' ';
|
||||
$logMessage .= '[' . $this->logToString[$level] . ']: ';
|
||||
$logMessage .= $this->psrInterpolate($message, $context) . ' ';
|
||||
$logMessage .= @json_encode($context) . ' - ';
|
||||
$logMessage .= @json_encode($record);
|
||||
$logMessage .= $this->jsonEncodeArray($context) . ' - ';
|
||||
$logMessage .= $this->jsonEncodeArray($record);
|
||||
|
||||
return $logMessage;
|
||||
}
|
||||
|
|
|
@ -512,7 +512,6 @@ class ParseUrl
|
|||
{
|
||||
if (!empty($siteinfo['images'])) {
|
||||
array_walk($siteinfo['images'], function (&$image) use ($page_url) {
|
||||
$image = [];
|
||||
// According to the specifications someone could place a picture url into the content field as well.
|
||||
// But this doesn't seem to happen in the wild, so we don't cover it here.
|
||||
if (!empty($image['url'])) {
|
||||
|
@ -525,7 +524,11 @@ class ParseUrl
|
|||
$image['contenttype'] = $photodata['mime'];
|
||||
unset($image['url']);
|
||||
ksort($image);
|
||||
} else {
|
||||
$image = [];
|
||||
}
|
||||
} else {
|
||||
$image = [];
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -711,7 +714,7 @@ class ParseUrl
|
|||
|
||||
array_walk_recursive($siteinfo, function (&$element) {
|
||||
if (is_string($element)) {
|
||||
$element = html_entity_decode($element, ENT_COMPAT, 'UTF-8');
|
||||
$element = trim(strip_tags(html_entity_decode($element, ENT_COMPAT, 'UTF-8')));
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -319,4 +319,27 @@ class CacheTest extends MockedTest
|
|||
self::assertEquals(23, $configCache->get('database', 'password'));
|
||||
self::assertEmpty($configCache->get('database', 'username'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the set() method with overrides
|
||||
* @dataProvider dataTests
|
||||
*/
|
||||
public function testSetOverrides($data)
|
||||
{
|
||||
|
||||
$configCache = new Cache();
|
||||
$configCache->load($data, Cache::SOURCE_DB);
|
||||
|
||||
// test with wrong override
|
||||
self::assertFalse($configCache->set('system', 'test', '1234567', Cache::SOURCE_FILE));
|
||||
self::assertEquals($data['system']['test'], $configCache->get('system', 'test'));
|
||||
|
||||
// test with override (equal)
|
||||
self::assertTrue($configCache->set('system', 'test', '8910', Cache::SOURCE_DB));
|
||||
self::assertEquals('8910', $configCache->get('system', 'test'));
|
||||
|
||||
// test with override (over)
|
||||
self::assertTrue($configCache->set('system', 'test', '111213', Cache::SOURCE_ENV));
|
||||
self::assertEquals('111213', $configCache->get('system', 'test'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -437,4 +437,35 @@ abstract class ConfigTest extends MockedTest
|
|||
|
||||
self::assertEmpty($this->testedConfig->getCache()->getAll());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the configuration get() and set() method where the db value has a higher prio than the config file
|
||||
*/
|
||||
public function testSetGetHighPrio()
|
||||
{
|
||||
$this->testedConfig = $this->getInstance();
|
||||
self::assertInstanceOf(Cache::class, $this->testedConfig->getCache());
|
||||
|
||||
$this->testedConfig->getCache()->set('config', 'test', 'prio', Cache::SOURCE_FILE);
|
||||
self::assertEquals('prio', $this->testedConfig->get('config', 'test'));
|
||||
|
||||
// now you have to get the new variable entry because of the new set the get refresh succeed as well
|
||||
self::assertTrue($this->testedConfig->set('config', 'test', '123'));
|
||||
self::assertEquals('123', $this->testedConfig->get('config', 'test', '', true));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the configuration get() and set() method where the db value has a lower prio than the env
|
||||
*/
|
||||
public function testSetGetLowPrio()
|
||||
{
|
||||
$this->testedConfig = $this->getInstance();
|
||||
self::assertInstanceOf(Cache::class, $this->testedConfig->getCache());
|
||||
self::assertEquals('it', $this->testedConfig->get('config', 'test'));
|
||||
|
||||
$this->testedConfig->getCache()->set('config', 'test', 'prio', Cache::SOURCE_ENV);
|
||||
// now you have to get the env variable entry as output, even with a new set (which failed) and a get refresh
|
||||
self::assertFalse($this->testedConfig->set('config', 'test', '123'));
|
||||
self::assertEquals('prio', $this->testedConfig->get('config', 'test', '', true));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -198,4 +198,58 @@ class JitConfigTest extends ConfigTest
|
|||
|
||||
parent::testDeleteWithDB();
|
||||
}
|
||||
|
||||
public function testSetGetHighPrio()
|
||||
{
|
||||
$this->configModel->shouldReceive('isConnected')
|
||||
->andReturn(true);
|
||||
|
||||
// constructor loading
|
||||
$this->configModel->shouldReceive('load')
|
||||
->with('config')
|
||||
->andReturn(['config' => []])
|
||||
->once();
|
||||
|
||||
$this->configModel->shouldReceive('get')
|
||||
->with('config', 'test')
|
||||
->andReturn('prio')
|
||||
->once();
|
||||
|
||||
$this->configModel->shouldReceive('set')
|
||||
->with('config', 'test', '123')
|
||||
->andReturn(true)
|
||||
->once();
|
||||
|
||||
$this->configModel->shouldReceive('get')
|
||||
->with('config', 'test')
|
||||
->andReturn('123')
|
||||
->once();
|
||||
|
||||
parent::testSetGetHighPrio();
|
||||
}
|
||||
|
||||
public function testSetGetLowPrio()
|
||||
{
|
||||
$this->configModel->shouldReceive('isConnected')
|
||||
->andReturn(true);
|
||||
|
||||
// constructor loading
|
||||
$this->configModel->shouldReceive('load')
|
||||
->with('config')
|
||||
->andReturn(['config' => ['test' => 'it']])
|
||||
->once();
|
||||
|
||||
$this->configModel->shouldReceive('set')
|
||||
->with('config', 'test', '123')
|
||||
->andReturn(true)
|
||||
->once();
|
||||
|
||||
// mocking one get without result
|
||||
$this->configModel->shouldReceive('get')
|
||||
->with('config', 'test')
|
||||
->andReturn('it')
|
||||
->once();
|
||||
|
||||
parent::testSetGetLowPrio();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,4 +162,52 @@ class PreloadConfigTest extends ConfigTest
|
|||
|
||||
parent::testDeleteWithDB();
|
||||
}
|
||||
|
||||
|
||||
public function testSetGetHighPrio()
|
||||
{
|
||||
$this->configModel->shouldReceive('isConnected')
|
||||
->andReturn(true);
|
||||
|
||||
// constructor loading
|
||||
$this->configModel->shouldReceive('load')
|
||||
->andReturn(['config' => []])
|
||||
->once();
|
||||
|
||||
$this->configModel->shouldReceive('set')
|
||||
->with('config', 'test', '123')
|
||||
->andReturn(true)
|
||||
->once();
|
||||
|
||||
$this->configModel->shouldReceive('get')
|
||||
->with('config', 'test')
|
||||
->andReturn('123')
|
||||
->once();
|
||||
|
||||
parent::testSetGetHighPrio();
|
||||
}
|
||||
|
||||
public function testSetGetLowPrio()
|
||||
{
|
||||
$this->configModel->shouldReceive('isConnected')
|
||||
->andReturn(true);
|
||||
|
||||
// constructor loading
|
||||
$this->configModel->shouldReceive('load')
|
||||
->andReturn(['config' => ['test' => 'it']])
|
||||
->once();
|
||||
|
||||
$this->configModel->shouldReceive('set')
|
||||
->with('config', 'test', '123')
|
||||
->andReturn(true)
|
||||
->once();
|
||||
|
||||
// mocking one get without result
|
||||
$this->configModel->shouldReceive('get')
|
||||
->with('config', 'test')
|
||||
->andReturn('it')
|
||||
->once();
|
||||
|
||||
parent::testSetGetLowPrio();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -159,4 +159,23 @@ abstract class AbstractLoggerTest extends MockedTest
|
|||
|
||||
self::assertContains(@json_encode($context), $text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test a message with an exception
|
||||
*/
|
||||
public function testExceptionHandling()
|
||||
{
|
||||
$e = new \Exception("Test String", 123);
|
||||
$eFollowUp = new \Exception("FollowUp", 456, $e);
|
||||
|
||||
$assertion = $eFollowUp->__toString();
|
||||
|
||||
$logger = $this->getInstance();
|
||||
$logger->alert('test', ['e' => $eFollowUp]);
|
||||
$text = $this->getContent();
|
||||
|
||||
self::assertLogline($text);
|
||||
|
||||
self::assertContains(@json_encode($assertion), $this->getContent());
|
||||
}
|
||||
}
|
||||
|
|
17221
view/lang/C/messages.po
17221
view/lang/C/messages.po
File diff suppressed because it is too large
Load diff
18322
view/lang/hu/messages.po
18322
view/lang/hu/messages.po
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
17419
view/lang/it/messages.po
17419
view/lang/it/messages.po
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
17993
view/lang/ru/messages.po
17993
view/lang/ru/messages.po
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue